fopen: allocate the dir after fopen

Move the allocation of the directory name down to after the fopen() call
to allow that shortcut code path to avoid a superfluous malloc+free
cycle.

Follow-up to 73b65e94f3

Closes #12398
This commit is contained in:
Daniel Stenberg 2023-11-24 09:46:32 +01:00
Родитель 5b65e7d1ae
Коммит f27b8dba73
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 5CC908FDB71E12C2
1 изменённых файлов: 9 добавлений и 11 удалений

Просмотреть файл

@ -99,18 +99,13 @@ CURLcode Curl_fopen(struct Curl_easy *data, const char *filename,
char *tempstore = NULL;
struct_stat sb;
int fd = -1;
char *dir;
char *dir = NULL;
*tempname = NULL;
dir = dirslash(filename);
if(!dir)
goto fail;
*fh = fopen(filename, FOPEN_WRITETEXT);
if(!*fh)
goto fail;
if(fstat(fileno(*fh), &sb) == -1 || !S_ISREG(sb.st_mode)) {
free(dir);
return CURLE_OK;
}
fclose(*fh);
@ -120,9 +115,14 @@ CURLcode Curl_fopen(struct Curl_easy *data, const char *filename,
if(result)
goto fail;
/* The temp file name should not end up too long for the target file
system */
tempstore = aprintf("%s%s.tmp", dir, randbuf);
dir = dirslash(filename);
if(dir) {
/* The temp file name should not end up too long for the target file
system */
tempstore = aprintf("%s%s.tmp", dir, randbuf);
free(dir);
}
if(!tempstore) {
result = CURLE_OUT_OF_MEMORY;
goto fail;
@ -137,7 +137,6 @@ CURLcode Curl_fopen(struct Curl_easy *data, const char *filename,
if(!*fh)
goto fail;
free(dir);
*tempname = tempstore;
return CURLE_OK;
@ -148,7 +147,6 @@ fail:
}
free(tempstore);
free(dir);
return result;
}