62 lines
1.9 KiB
Diff
62 lines
1.9 KiB
Diff
From e1873ad576cb478fff0e6e44ad99599cd5fd2846 Mon Sep 17 00:00:00 2001
|
|
From: Elliot Gorokhovsky <embg@fb.com>
|
|
Date: Fri, 29 Jul 2022 11:10:47 -0700
|
|
Subject: [PATCH] Fix buffer underflow for null dir1
|
|
|
|
---
|
|
programs/util.c | 40 ++++++++++++++++++++--------------------
|
|
1 file changed, 20 insertions(+), 20 deletions(-)
|
|
|
|
--- a/programs/util.c
|
|
+++ b/programs/util.c
|
|
@@ -809,30 +809,30 @@ static const char * trimPath(const char
|
|
|
|
static char* mallocAndJoin2Dir(const char *dir1, const char *dir2)
|
|
{
|
|
- const size_t dir1Size = strlen(dir1);
|
|
- const size_t dir2Size = strlen(dir2);
|
|
- char *outDirBuffer, *buffer, trailingChar;
|
|
-
|
|
assert(dir1 != NULL && dir2 != NULL);
|
|
- outDirBuffer = (char *) malloc(dir1Size + dir2Size + 2);
|
|
- CONTROL(outDirBuffer != NULL);
|
|
-
|
|
- memcpy(outDirBuffer, dir1, dir1Size);
|
|
- outDirBuffer[dir1Size] = '\0';
|
|
+ { const size_t dir1Size = strlen(dir1);
|
|
+ const size_t dir2Size = strlen(dir2);
|
|
+ char *outDirBuffer, *buffer;
|
|
+
|
|
+ outDirBuffer = (char *) malloc(dir1Size + dir2Size + 2);
|
|
+ CONTROL(outDirBuffer != NULL);
|
|
+
|
|
+ memcpy(outDirBuffer, dir1, dir1Size);
|
|
+ outDirBuffer[dir1Size] = '\0';
|
|
+
|
|
+ if (dir2[0] == '.')
|
|
+ return outDirBuffer;
|
|
+
|
|
+ buffer = outDirBuffer + dir1Size;
|
|
+ if (dir1Size > 0 && *(buffer - 1) != PATH_SEP) {
|
|
+ *buffer = PATH_SEP;
|
|
+ buffer++;
|
|
+ }
|
|
+ memcpy(buffer, dir2, dir2Size);
|
|
+ buffer[dir2Size] = '\0';
|
|
|
|
- if (dir2[0] == '.')
|
|
return outDirBuffer;
|
|
-
|
|
- buffer = outDirBuffer + dir1Size;
|
|
- trailingChar = *(buffer - 1);
|
|
- if (trailingChar != PATH_SEP) {
|
|
- *buffer = PATH_SEP;
|
|
- buffer++;
|
|
}
|
|
- memcpy(buffer, dir2, dir2Size);
|
|
- buffer[dir2Size] = '\0';
|
|
-
|
|
- return outDirBuffer;
|
|
}
|
|
|
|
/* this function will return NULL if input srcFileName is not valid name for mirrored output path */
|