From: Joseph Sutton Date: Mon, 13 Feb 2023 01:58:52 +0000 (+1300) Subject: smbd/notify: Handle allocation failure X-Git-Tag: talloc-2.4.1~941 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=78ca3e16da77ba13ef5fc0ae303bb4a371ebcf8d;p=thirdparty%2Fsamba.git smbd/notify: Handle allocation failure 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 Reviewed-by: Andreas Schneider --- diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index c18ad0027b6..87f08124171 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -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';