mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 19:41:16 +00:00
absolutePathFromBaseFile: don't leak when first arg contains no "/"
* src/util/storage_file.c: Include "dirname.h". (absolutePathFromBaseFile): Rewrite not to leak, and to require fewer allocations. * bootstrap (modules): Add dirname-lgpl. * .gnulib: Update submodule to the latest.
This commit is contained in:
parent
a7e80e6bfd
commit
53b7dae139
2
.gnulib
2
.gnulib
@ -1 +1 @@
|
|||||||
Subproject commit 146d9145073e62a2096a2d6b33f75e93908fedf3
|
Subproject commit 9d0ad652de159d08e5f679842f8a2a5658196361
|
@ -71,6 +71,7 @@ c-ctype
|
|||||||
canonicalize-lgpl
|
canonicalize-lgpl
|
||||||
close
|
close
|
||||||
connect
|
connect
|
||||||
|
dirname-lgpl
|
||||||
getaddrinfo
|
getaddrinfo
|
||||||
gethostname
|
gethostname
|
||||||
getpass
|
getpass
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* storage_file.c: file utility functions for FS storage backend
|
* storage_file.c: file utility functions for FS storage backend
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009 Red Hat, Inc.
|
* Copyright (C) 2007-2010 Red Hat, Inc.
|
||||||
* Copyright (C) 2007-2008 Daniel P. Berrange
|
* Copyright (C) 2007-2008 Daniel P. Berrange
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include "dirname.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "virterror_internal.h"
|
#include "virterror_internal.h"
|
||||||
|
|
||||||
@ -246,26 +247,15 @@ vmdk4GetBackingStore(virConnectPtr conn,
|
|||||||
static char *
|
static char *
|
||||||
absolutePathFromBaseFile(const char *base_file, const char *path)
|
absolutePathFromBaseFile(const char *base_file, const char *path)
|
||||||
{
|
{
|
||||||
size_t base_size, path_size;
|
char *res;
|
||||||
char *res, *p;
|
size_t d_len = dir_len (base_file);
|
||||||
|
|
||||||
if (*path == '/')
|
/* If path is already absolute, or if dirname(base_file) is ".",
|
||||||
|
just return a copy of path. */
|
||||||
|
if (*path == '/' || d_len == 0)
|
||||||
return strdup(path);
|
return strdup(path);
|
||||||
|
|
||||||
base_size = strlen(base_file) + 1;
|
virAsprintf(&res, "%.*s/%s", base_file, d_len, path);
|
||||||
path_size = strlen(path) + 1;
|
|
||||||
if (VIR_ALLOC_N(res, base_size - 1 + path_size) < 0)
|
|
||||||
return NULL;
|
|
||||||
memcpy(res, base_file, base_size);
|
|
||||||
p = strrchr(res, '/');
|
|
||||||
if (p != NULL)
|
|
||||||
p++;
|
|
||||||
else
|
|
||||||
p = res;
|
|
||||||
memcpy(p, path, path_size);
|
|
||||||
if (VIR_REALLOC_N(res, (p + path_size) - res) < 0) {
|
|
||||||
/* Ignore failure */
|
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user