Blob Blame History Raw
Store an empty string in the passed-in buffer, even if we don't manage to get
the desired value from the entry.

Index: nslcd/attmap.c
===================================================================
--- nslcd/attmap.c	(revision 1110)
+++ nslcd/attmap.c	(revision 1111)
@@ -251,20 +251,25 @@
   return values[0];
 }
 
-MUST_USE const char *attmap_get_value(MYLDAP_ENTRY *entry,const char *attr,char *buffer,size_t buflen)
+const char *attmap_get_value(MYLDAP_ENTRY *entry,const char *attr,char *buffer,size_t buflen)
 {
   const char **values;
+  /* check and clear buffer */
+  if ((buffer==NULL)||(buflen<=0))
+    return NULL;
+  buffer[0]='\0';
   /* for simple values just return the attribute */
   if (attr[0]!='"')
   {
     values=myldap_get_values(entry,attr);
-    if (values==NULL)
+    if ((values==NULL)||(values[0]==NULL))
       return NULL;
     strncpy(buffer,values[0],buflen);
     buffer[buflen-1]='\0';
     return buffer;
     /* TODO: maybe warn when multiple values are found */
   }
+  /* we have an expression, try to parse */
   if ( (attr[strlen(attr)-1]!='"') ||
        (expr_parse(attr+1,buffer,buflen,entry_expand,(void *)entry)==NULL) )
   {
Index: nslcd/attmap.h
===================================================================
--- nslcd/attmap.h	(revision 1110)
+++ nslcd/attmap.h	(revision 1111)
@@ -86,11 +86,11 @@
 
 /* Set the attribute mapping of the variable to the value specified.
    Returns the new value on success. */
+MUST_USE const char *attmap_set_mapping(const char **var,const char *value);
 
-const char *attmap_set_mapping(const char **var,const char *value);
-
 /* Return a value for the attribute, handling the case where attr
-   is an expression. */
+   is an expression. On error (e.g. problem parsing expression, attribute
+   value not found) it returns NULL and the buffer is made empty. */
 const char *attmap_get_value(MYLDAP_ENTRY *entry,const char *attr,char *buffer,size_t buflen);
 
 /* Add the attributes from attr to the set. The attr argumenent