Print this page
1668 CVE 2011-3508 (ldap format string issues)

*** 20,33 **** * CDDL HEADER END */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ - #pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/systeminfo.h> #include "ldap_common.h" #ifdef DEBUG --- 20,32 ---- * CDDL HEADER END */ /* * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2011 Nexenta Systems, Inc. All rights reserved. */ #include <sys/systeminfo.h> #include "ldap_common.h" #ifdef DEBUG
*** 213,222 **** --- 212,222 ---- _merge_SSD_filter(const ns_ldap_search_desc_t *desc, char **realfilter, const void *userdata) { int len; + char *checker; #ifdef DEBUG (void) fprintf(stdout, "\n[ldap_utils.c: _merge_SSD_filter]\n"); #endif /* DEBUG */
*** 223,236 **** /* sanity check */ if (realfilter == NULL) return (NS_LDAP_INVALID_PARAM); *realfilter = NULL; ! if (desc == NULL || desc->filter == NULL || ! userdata == NULL) return (NS_LDAP_INVALID_PARAM); #ifdef DEBUG (void) fprintf(stdout, "\n[userdata: %s]\n", (char *)userdata); (void) fprintf(stdout, "\n[SSD filter: %s]\n", desc->filter); #endif /* DEBUG */ --- 223,249 ---- /* sanity check */ if (realfilter == NULL) return (NS_LDAP_INVALID_PARAM); *realfilter = NULL; ! if (desc == NULL || desc->filter == NULL || userdata == NULL) return (NS_LDAP_INVALID_PARAM); + /* Parameter check. We only want one %s here, otherwise bail. */ + len = 0; /* Reuse 'len' as "Number of %s hits"... */ + checker = (char *)userdata; + do { + checker = strchr(checker, '%'); + if (checker != NULL) { + if (len > 0 || *(checker + 1) != 's') + return (NS_LDAP_INVALID_PARAM); + len++; /* Got our %s. */ + checker += 2; + } else if (len != 1) + return (NS_LDAP_INVALID_PARAM); + } while (checker != NULL); + #ifdef DEBUG (void) fprintf(stdout, "\n[userdata: %s]\n", (char *)userdata); (void) fprintf(stdout, "\n[SSD filter: %s]\n", desc->filter); #endif /* DEBUG */
*** 238,249 **** *realfilter = (char *)malloc(len); if (*realfilter == NULL) return (NS_LDAP_MEMORY); ! (void) sprintf(*realfilter, (char *)userdata, ! desc->filter); #ifdef DEBUG (void) fprintf(stdout, "\n[new filter: %s]\n", *realfilter); #endif /* DEBUG */ --- 251,261 ---- *realfilter = (char *)malloc(len); if (*realfilter == NULL) return (NS_LDAP_MEMORY); ! (void) sprintf(*realfilter, (char *)userdata, desc->filter); #ifdef DEBUG (void) fprintf(stdout, "\n[new filter: %s]\n", *realfilter); #endif /* DEBUG */