@@ -1178,73 +1178,68 @@ static void report_pack_garbage(struct string_list *list)
11781178
11791179static void prepare_packed_git_one (char * objdir , int local )
11801180{
1181- /* Ensure that this buffer is large enough so that we can
1182- append "/pack/" without clobbering the stack even if
1183- strlen(objdir) were PATH_MAX. */
1184- char path [PATH_MAX + 1 + 4 + 1 + 1 ];
1185- int len ;
1181+ struct strbuf path = STRBUF_INIT ;
1182+ size_t dirnamelen ;
11861183 DIR * dir ;
11871184 struct dirent * de ;
11881185 struct string_list garbage = STRING_LIST_INIT_DUP ;
11891186
1190- sprintf ( path , "%s/pack" , objdir );
1191- len = strlen ( path );
1192- dir = opendir (path );
1187+ strbuf_addstr ( & path , objdir );
1188+ strbuf_addstr ( & path , "/pack" );
1189+ dir = opendir (path . buf );
11931190 if (!dir ) {
11941191 if (errno != ENOENT )
11951192 error ("unable to open object pack directory: %s: %s" ,
1196- path , strerror (errno ));
1193+ path .buf , strerror (errno ));
1194+ strbuf_release (& path );
11971195 return ;
11981196 }
1199- path [len ++ ] = '/' ;
1197+ strbuf_addch (& path , '/' );
1198+ dirnamelen = path .len ;
12001199 while ((de = readdir (dir )) != NULL ) {
1201- int namelen = strlen (de -> d_name );
12021200 struct packed_git * p ;
1203-
1204- if (len + namelen + 1 > sizeof (path )) {
1205- if (report_garbage ) {
1206- struct strbuf sb = STRBUF_INIT ;
1207- strbuf_addf (& sb , "%.*s/%s" , len - 1 , path , de -> d_name );
1208- report_garbage ("path too long" , sb .buf );
1209- strbuf_release (& sb );
1210- }
1211- continue ;
1212- }
1201+ size_t base_len ;
12131202
12141203 if (is_dot_or_dotdot (de -> d_name ))
12151204 continue ;
12161205
1217- strcpy (path + len , de -> d_name );
1206+ strbuf_setlen (& path , dirnamelen );
1207+ strbuf_addstr (& path , de -> d_name );
12181208
1219- if (has_extension (de -> d_name , ".idx" )) {
1209+ base_len = path .len ;
1210+ if (strip_suffix_mem (path .buf , & base_len , ".idx" )) {
12201211 /* Don't reopen a pack we already have. */
12211212 for (p = packed_git ; p ; p = p -> next ) {
1222- if (!memcmp (path , p -> pack_name , len + namelen - 4 ))
1213+ size_t len ;
1214+ if (strip_suffix (p -> pack_name , ".pack" , & len ) &&
1215+ len == base_len &&
1216+ !memcmp (p -> pack_name , path .buf , len ))
12231217 break ;
12241218 }
12251219 if (p == NULL &&
12261220 /*
12271221 * See if it really is a valid .idx file with
12281222 * corresponding .pack file that we can map.
12291223 */
1230- (p = add_packed_git (path , len + namelen , local )) != NULL )
1224+ (p = add_packed_git (path . buf , path . len , local )) != NULL )
12311225 install_packed_git (p );
12321226 }
12331227
12341228 if (!report_garbage )
12351229 continue ;
12361230
1237- if (has_extension (de -> d_name , ".idx" ) ||
1238- has_extension (de -> d_name , ".pack" ) ||
1239- has_extension (de -> d_name , ".bitmap" ) ||
1240- has_extension (de -> d_name , ".keep" ))
1241- string_list_append (& garbage , path );
1231+ if (ends_with (de -> d_name , ".idx" ) ||
1232+ ends_with (de -> d_name , ".pack" ) ||
1233+ ends_with (de -> d_name , ".bitmap" ) ||
1234+ ends_with (de -> d_name , ".keep" ))
1235+ string_list_append (& garbage , path . buf );
12421236 else
1243- report_garbage ("garbage found" , path );
1237+ report_garbage ("garbage found" , path . buf );
12441238 }
12451239 closedir (dir );
12461240 report_pack_garbage (& garbage );
12471241 string_list_clear (& garbage , 0 );
1242+ strbuf_release (& path );
12481243}
12491244
12501245static int sort_pack (const void * a_ , const void * b_ )
0 commit comments