]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd/notify: Handle allocation failure
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Mon, 13 Feb 2023 01:58:52 +0000 (14:58 +1300)
committerAndreas Schneider <asn@cryptomilk.org>
Wed, 12 Apr 2023 13:52:31 +0000 (13:52 +0000)
If a talloc function returns NULL, indicating failure, the failure could
be masked by the next talloc call allocating on the NULL context.

Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andreas Schneider <asn@samba.org>
source3/smbd/notify.c

index c18ad0027b67703d584d79db0aa3bd6157107930..87f081241712ee609e55f270cc9a81e28bf91342 100644 (file)
@@ -864,33 +864,83 @@ char *notify_filter_string(TALLOC_CTX *mem_ctx, uint32_t filter)
        char *result = NULL;
 
        result = talloc_strdup(mem_ctx, "");
+       if (result == NULL) {
+               return NULL;
+       }
 
-       if (filter & FILE_NOTIFY_CHANGE_FILE_NAME)
+       if (filter & FILE_NOTIFY_CHANGE_FILE_NAME) {
                result = talloc_asprintf_append(result, "FILE_NAME|");
-       if (filter & FILE_NOTIFY_CHANGE_DIR_NAME)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_DIR_NAME) {
                result = talloc_asprintf_append(result, "DIR_NAME|");
-       if (filter & FILE_NOTIFY_CHANGE_ATTRIBUTES)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_ATTRIBUTES) {
                result = talloc_asprintf_append(result, "ATTRIBUTES|");
-       if (filter & FILE_NOTIFY_CHANGE_SIZE)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_SIZE) {
                result = talloc_asprintf_append(result, "SIZE|");
-       if (filter & FILE_NOTIFY_CHANGE_LAST_WRITE)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_LAST_WRITE) {
                result = talloc_asprintf_append(result, "LAST_WRITE|");
-       if (filter & FILE_NOTIFY_CHANGE_LAST_ACCESS)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_LAST_ACCESS) {
                result = talloc_asprintf_append(result, "LAST_ACCESS|");
-       if (filter & FILE_NOTIFY_CHANGE_CREATION)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_CREATION) {
                result = talloc_asprintf_append(result, "CREATION|");
-       if (filter & FILE_NOTIFY_CHANGE_EA)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_EA) {
                result = talloc_asprintf_append(result, "EA|");
-       if (filter & FILE_NOTIFY_CHANGE_SECURITY)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_SECURITY) {
                result = talloc_asprintf_append(result, "SECURITY|");
-       if (filter & FILE_NOTIFY_CHANGE_STREAM_NAME)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_STREAM_NAME) {
                result = talloc_asprintf_append(result, "STREAM_NAME|");
-       if (filter & FILE_NOTIFY_CHANGE_STREAM_SIZE)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_STREAM_SIZE) {
                result = talloc_asprintf_append(result, "STREAM_SIZE|");
-       if (filter & FILE_NOTIFY_CHANGE_STREAM_WRITE)
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
+       if (filter & FILE_NOTIFY_CHANGE_STREAM_WRITE) {
                result = talloc_asprintf_append(result, "STREAM_WRITE|");
+               if (result == NULL) {
+                       return NULL;
+               }
+       }
 
-       if (result == NULL) return NULL;
        if (*result == '\0') return result;
 
        result[strlen(result)-1] = '\0';