void list_dumpdir (char *buffer, idx_t size);
void update_parent_directory (struct tar_stat_info *st);
+bool dumpdir_ok (char const *dumpdir, idx_t size);
idx_t dumpdir_size (const char *p);
bool is_dumpdir (struct tar_stat_info *stat_info);
void clear_directory_table (void);
{
d->flags |= f;
}
+
static void
dir_clear_flag (struct directory *d, int f)
{
mv_end ();
+ if (!dumpdir_ok (archive_dir, stat_info->stat.st_size))
+ {
+ stat_info->is_dumpdir = false;
+ free (archive_dir);
+ archive_dir = NULL;
+ }
stat_info->dumpdir = archive_dir;
stat_info->skipped = true; /* For skip_member() and friends
to work correctly */
return stat_info->is_dumpdir;
}
-static bool
-dumpdir_ok (char *dumpdir)
+bool
+dumpdir_ok (char const *dumpdir, idx_t size)
{
- char *p;
+ char const *p;
bool has_tempdir = false;
char expect = '\0';
+ if (!(size > 0 &&
+ dumpdir[size-1] == 0 && (size == 1 || dumpdir[size-2] == 0)))
+ {
+ paxerror (0, _("Malformed dumpdir: missing terminator"));
+ return false;
+ }
+
for (p = dumpdir; *p; p += strlen (p) + 1)
{
if (expect && *p != expect)
case, we don't have to delete any files out of it. */
return;
- /* Verify if dump directory is sane */
- if (!dumpdir_ok (current_stat_info.dumpdir))
- return;
-
/* Process renames */
for (arc = current_stat_info.dumpdir; *arc; arc += strlen (arc) + 1)
{
char const *arg,
idx_t size)
{
- st->dumpdir = ximalloc (size);
- memcpy (st->dumpdir, arg, size);
+ if (dumpdir_ok (arg, size))
+ {
+ st->dumpdir = ximalloc (size);
+ memcpy (st->dumpdir, arg, size);
+ }
+ else
+ paxerror (0, _("Malformed dumpdir: missing terminator"));
}
static void