git, subversion: avoid a potential double-free

This should fix the detection of directories managed by Git or
Subversion.
This commit is contained in:
Pierre Pronchery 2024-06-03 03:02:27 +02:00
parent 413f082089
commit 8da8e4f6fb
2 changed files with 12 additions and 12 deletions

View File

@ -379,13 +379,10 @@ static String * _git_get_base(Git * git, char const * filename)
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, filename); fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, filename);
#endif #endif
cur = g_path_get_dirname(filename); cur = g_strdup(filename);
for(dir = cur; string_compare(dir, ".") != 0; while(string_compare(cur, ".") != 0)
dir = g_path_get_dirname(cur))
{ {
g_free(cur); if((p = string_new_append(cur, "/.git", NULL)) == NULL)
cur = dir;
if((p = string_new_append(dir, "/.git", NULL)) == NULL)
break; break;
res = lstat(p, &st); res = lstat(p, &st);
#ifdef DEBUG #ifdef DEBUG
@ -396,8 +393,11 @@ static String * _git_get_base(Git * git, char const * filename)
g_free(cur); g_free(cur);
return p; return p;
} }
if(string_compare(dir, "/") == 0) if(string_compare(cur, "/") == 0)
break; break;
dir = g_path_get_dirname(cur);
g_free(cur);
cur = dir;
} }
g_free(cur); g_free(cur);
return NULL; return NULL;

View File

@ -362,12 +362,9 @@ static String * _subversion_get_base(SVN * svn, char const * filename)
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, filename); fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, filename);
#endif #endif
cur = g_path_get_dirname(filename); cur = g_strdup(filename);
for(dir = cur; string_compare(dir, ".") != 0; while(string_compare(cur, ".") != 0)
dir = g_path_get_dirname(cur))
{ {
g_free(cur);
cur = dir;
if((p = string_new_append(dir, "/.svn", NULL)) == NULL) if((p = string_new_append(dir, "/.svn", NULL)) == NULL)
break; break;
res = lstat(p, &st); res = lstat(p, &st);
@ -381,6 +378,9 @@ static String * _subversion_get_base(SVN * svn, char const * filename)
} }
if(string_compare(dir, "/") == 0) if(string_compare(dir, "/") == 0)
break; break;
dir = g_path_get_dirname(cur);
g_free(cur);
cur = dir;
} }
g_free(cur); g_free(cur);
return NULL; return NULL;