summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2013-07-21 21:05:11 (GMT)
committerChristian Heimes <christian@cheimes.de>2013-07-21 21:05:11 (GMT)
commite5378e2223c00bdf3b7eb36a9c19b89d24feb0f9 (patch)
tree34078820174a027c29af512ab412c9db970fbd5e
parentc3e10c237b977ef7e180085f9ba04f58b663b122 (diff)
parent43d82df406114223c70961f0774d622536a0629d (diff)
downloadcpython-e5378e2223c00bdf3b7eb36a9c19b89d24feb0f9.zip
cpython-e5378e2223c00bdf3b7eb36a9c19b89d24feb0f9.tar.gz
cpython-e5378e2223c00bdf3b7eb36a9c19b89d24feb0f9.tar.bz2
Now all error paths of _freeze_importlib use 'goto error' and the error label cleans up all used resources.
-rw-r--r--Modules/_freeze_importlib.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/Modules/_freeze_importlib.c b/Modules/_freeze_importlib.c
index 75013e1..57b1ac0 100644
--- a/Modules/_freeze_importlib.c
+++ b/Modules/_freeze_importlib.c
@@ -34,12 +34,12 @@ int
main(int argc, char *argv[])
{
char *inpath, *outpath;
- FILE *infile, *outfile = NULL;
+ FILE *infile = NULL, *outfile = NULL;
struct stat st;
size_t text_size, data_size, n;
- char *text;
+ char *text = NULL;
unsigned char *data;
- PyObject *code, *marshalled;
+ PyObject *code = NULL, *marshalled = NULL;
PyImport_FrozenModules = _PyImport_FrozenModules;
@@ -52,19 +52,17 @@ main(int argc, char *argv[])
infile = fopen(inpath, "rb");
if (infile == NULL) {
fprintf(stderr, "cannot open '%s' for reading\n", inpath);
- return 1;
+ goto error;
}
if (fstat(fileno(infile), &st)) {
- fclose(infile);
fprintf(stderr, "cannot fstat '%s'\n", inpath);
- return 1;
+ goto error;
}
text_size = st.st_size;
text = (char *) malloc(text_size + 1);
if (text == NULL) {
- fclose(infile);
fprintf(stderr, "could not allocate %ld bytes\n", (long) text_size);
- return 1;
+ goto error;
}
n = fread(text, 1, text_size, infile);
fclose(infile);
@@ -72,8 +70,7 @@ main(int argc, char *argv[])
if (n < text_size) {
fprintf(stderr, "read too short: got %ld instead of %ld bytes\n",
(long) n, (long) text_size);
- free(text);
- return 1;
+ goto error;
}
text[text_size] = '\0';
@@ -87,11 +84,13 @@ main(int argc, char *argv[])
code = Py_CompileStringExFlags(text, "<frozen importlib._bootstrap>",
Py_file_input, NULL, 0);
- free(text);
if (code == NULL)
goto error;
+ free(text);
+ text = NULL;
+
marshalled = PyMarshal_WriteObjectToString(code, Py_MARSHAL_VERSION);
- Py_DECREF(code);
+ Py_CLEAR(code);
if (marshalled == NULL)
goto error;
@@ -104,8 +103,7 @@ main(int argc, char *argv[])
outfile = fopen(outpath, "w");
if (outfile == NULL) {
fprintf(stderr, "cannot open '%s' for writing\n", outpath);
- Py_DECREF(marshalled);
- return 1;
+ goto error;
}
fprintf(outfile, "%s\n", header);
fprintf(outfile, "const unsigned char _Py_M__importlib[] = {\n");
@@ -119,16 +117,13 @@ main(int argc, char *argv[])
}
fprintf(outfile, "};\n");
- Py_DECREF(marshalled);
+ Py_CLEAR(marshalled);
Py_Finalize();
- if (infile)
- fclose(infile);
if (outfile) {
if (ferror(outfile)) {
fprintf(stderr, "error when writing to '%s'\n", outpath);
- fclose(outfile);
- return 1;
+ goto error;
}
fclose(outfile);
}
@@ -141,5 +136,9 @@ error:
fclose(infile);
if (outfile)
fclose(outfile);
+ if (text)
+ free(text);
+ if (marshalled)
+ Py_DECREF(marshalled);
return 1;
}