View | Details | Raw Unified | Return to bug 96840
Collapse All | Expand All

(-)/usr/src/lib/libc/gen/getgrent.c (-29 / +12 lines)
Lines 967-973 Link Here
967
	int		*errnop, keylen, resultlen, rv;
967
	int		*errnop, keylen, resultlen, rv;
968
	
968
	
969
	name = NULL;
969
	name = NULL;
970
        key  = NULL;
971
	gid = (gid_t)-1;
970
	gid = (gid_t)-1;
972
	how = (enum nss_lookup_type)mdata;
971
	how = (enum nss_lookup_type)mdata;
973
	switch (how) {
972
	switch (how) {
Lines 1017-1032 Link Here
1017
		result = NULL;
1016
		result = NULL;
1018
		if (how == nss_lt_all) {
1017
		if (how == nss_lt_all) {
1019
			if (st->key == NULL)
1018
			if (st->key == NULL)
1020
				rv = yp_first(st->domain, map, &key,
1019
				rv = yp_first(st->domain, map, &st->key,
1021
				    &keylen, &result, &resultlen);
1020
				    &st->keylen, &result, &resultlen);
1022
			else {
1021
			else {
1023
				rv = yp_next(st->domain, map, 
1022
				key = st->key;
1024
                                    st->key, st->keylen,
1023
				keylen = st->keylen;
1025
                                    &key, &keylen, &result, &resultlen);
1024
				st->key = NULL;
1025
				rv = yp_next(st->domain, map, key, keylen,
1026
				    &st->key, &st->keylen, &result,
1027
				    &resultlen);
1028
				free(key);
1026
			}
1029
			}
1027
			if (rv != 0) {
1030
			if (rv != 0) {
1028
				free(result);
1031
				free(result);
1029
                                free(key);
1030
				free(st->key);
1032
				free(st->key);
1031
				st->key = NULL;
1033
				st->key = NULL;
1032
				if (rv == YPERR_NOMORE) {
1034
				if (rv == YPERR_NOMORE) {
Lines 1052-1086 Link Here
1052
		 * terminator, alignment padding, and one (char *)
1054
		 * terminator, alignment padding, and one (char *)
1053
		 * pointer for the member list terminator.
1055
		 * pointer for the member list terminator.
1054
		 */
1056
		 */
1055
		if (resultlen >= bufsize - _ALIGNBYTES - sizeof(char *)) {
1057
		if (resultlen >= bufsize - _ALIGNBYTES - sizeof(char *))
1056
                        if (how == nss_lt_all) {
1058
			goto erange;
1057
                                free(key);
1058
                        }
1059
                        goto erange;
1060
                }
1061
		memcpy(buffer, result, resultlen);
1059
		memcpy(buffer, result, resultlen);
1062
		buffer[resultlen] = '\0';
1060
		buffer[resultlen] = '\0';
1063
		free(result);
1061
		free(result);
1064
		rv = __gr_match_entry(buffer, resultlen, how, name, gid);
1062
		rv = __gr_match_entry(buffer, resultlen, how, name, gid);
1065
		if (rv == NS_SUCCESS) {
1063
		if (rv == NS_SUCCESS)
1066
			rv = __gr_parse_entry(buffer, resultlen, grp,
1064
			rv = __gr_parse_entry(buffer, resultlen, grp,
1067
			    &buffer[resultlen+1], bufsize - resultlen - 1,
1065
			    &buffer[resultlen+1], bufsize - resultlen - 1,
1068
			    errnop);
1066
			    errnop);
1069
                        if (*errnop == ERANGE) {
1070
                                if (how == nss_lt_all) {
1071
                                        free(key);
1072
                                }
1073
                                goto erange;
1074
                        }
1075
                }
1076
                if (how == nss_lt_all) {
1077
                        if (st->key != NULL) {
1078
                                free(st->key);
1079
                        }
1080
                        st->key = key;
1081
                        st->keylen = keylen;
1082
                        key = NULL;
1083
                }
1084
	} while (how == nss_lt_all && !(rv & NS_TERMINATE));
1067
	} while (how == nss_lt_all && !(rv & NS_TERMINATE));
1085
fin:
1068
fin:
1086
	if (rv == NS_SUCCESS && retval != NULL)
1069
	if (rv == NS_SUCCESS && retval != NULL)

Return to bug 96840