aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan K. Hubbard <jkh@FreeBSD.org>1999-05-05 10:14:06 +0000
committerJordan K. Hubbard <jkh@FreeBSD.org>1999-05-05 10:14:06 +0000
commit66e576f88da1738d44b11b96bc027d4761944277 (patch)
tree79ae77026bdf1a2e7480db1de286074159708717
parent3d0d924077b351c016e8d638ff746e73e540675c (diff)
downloadsrc-66e576f88da1738d44b11b96bc027d4761944277.tar.gz
src-66e576f88da1738d44b11b96bc027d4761944277.zip
Fix a few bogons and make this safer for humanity.
Notes
Notes: svn path=/head/; revision=46498
-rw-r--r--release/sysinstall/kget.c59
-rw-r--r--usr.sbin/sysinstall/kget.c59
2 files changed, 72 insertions, 46 deletions
diff --git a/release/sysinstall/kget.c b/release/sysinstall/kget.c
index b3cc55e38254..2520480e05c8 100644
--- a/release/sysinstall/kget.c
+++ b/release/sysinstall/kget.c
@@ -23,20 +23,20 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kget.c,v 1.3 1999/02/16 01:58:04 jkh Exp $
+ * $Id: kget.c,v 1.4 1999/03/10 02:50:31 jkh Exp $
*/
#include "sysinstall.h"
#include <sys/sysctl.h>
-#include "i386/isa/isa_device.h"
-#include "i386/isa/pnp.h"
+#include <isa/isa_device.h>
+#include <isa/pnp.h>
int
kget(char *out)
{
- int len, i, bytes_written = 0;
+ int len, i, bytes_written;
char *buf;
- char *mib = "machdep.uc_devlist";
+ char *mib1 = "machdep.uc_devlist";
char *mib2 = "machdep.uc_pnplist";
char name[9];
FILE *fout;
@@ -44,33 +44,41 @@ kget(char *out)
struct pnp_cinfo *c;
char *p;
- fout = fopen(out, "w");
- if (fout == NULL) {
- msgDebug("kget: Unable to open %s for writing.\n", out);
- return -1;
- }
-
/* We use sysctlbyname, because the oid is unknown (OID_AUTO) */
/* get the buffer size */
- i = sysctlbyname(mib, NULL, &len, NULL, NULL);
+ i = sysctlbyname(mib1, NULL, &len, NULL, NULL);
if (i) {
msgDebug("kget: error buffer sizing\n");
return -1;
}
- buf = (char *)malloc(len * sizeof(char));
- i = sysctlbyname(mib, buf, &len, NULL, NULL);
+ if (len <= 0) {
+ msgDebug("kget: mib1 has length of %d\n", len);
+ return -1;
+ }
+ buf = (char *)alloca(len * sizeof(char));
+ i = sysctlbyname(mib1, buf, &len, NULL, NULL);
if (i) {
msgDebug("kget: error retrieving data\n");
return -1;
}
- i = 0;
+
+ /* now it's time to create the output file; if we end up not writing to
+ it, we'll unlink() it later. */
+ fout = fopen(out, "w");
+ if (fout == NULL) {
+ msgDebug("kget: Unable to open %s for writing.\n", out);
+ return -1;
+ }
+
+ i = bytes_written = 0;
while (i < len) {
id = (struct isa_device *)(buf + i);
p = (buf + i + sizeof(struct isa_device));
strncpy(name, p, 8);
if (!id->id_enabled) {
bytes_written += fprintf(fout, "di %s%d\n", name, id->id_unit);
- } else {
+ }
+ else {
bytes_written += fprintf(fout, "en %s%d\n", name, id->id_unit);
if (id->id_iobase > 0) {
bytes_written += fprintf(fout, "po %s%d %#x\n",
@@ -97,7 +105,6 @@ kget(char *out)
}
i += sizeof(struct isa_device) + 8;
}
- free(buf), buf = NULL;
/* Now, print the changes to PnP override table */
i = sysctlbyname(mib2, NULL, &len, NULL, NULL);
if (i) {
@@ -105,14 +112,19 @@ kget(char *out)
msgDebug("kget: can't get PnP data - skipping...\n");
goto bail;
}
- buf = (char *)malloc(len * sizeof(char));
+ if (len <= 0) {
+ msgDebug("kget: PnP data has length of %d\n", len);
+ goto bail;
+ }
+ buf = (char *)alloca(len * sizeof(char));
i = sysctlbyname(mib2, buf, &len, NULL, NULL);
if (i) {
- msgDebug("kget: error retrieving data\n");
+ msgDebug("kget: error retrieving data mib2\n");
goto bail;
}
- i = 0;
/* Print the PnP override table. Taken from userconfig.c */
+
+ i = 0;
do {
c = (struct pnp_cinfo *)(buf + i);
if (c->csn >0 && c->csn != 255) {
@@ -143,9 +155,10 @@ kget(char *out)
}
} while ((i += sizeof(struct pnp_cinfo)) < len);
bail:
- fprintf(fout, "q\n");
+ if (bytes_written)
+ fprintf(fout, "q\n");
+ else
+ unlink(out);
fclose(fout);
- if (buf)
- free(buf);
return 0;
}
diff --git a/usr.sbin/sysinstall/kget.c b/usr.sbin/sysinstall/kget.c
index b3cc55e38254..2520480e05c8 100644
--- a/usr.sbin/sysinstall/kget.c
+++ b/usr.sbin/sysinstall/kget.c
@@ -23,20 +23,20 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kget.c,v 1.3 1999/02/16 01:58:04 jkh Exp $
+ * $Id: kget.c,v 1.4 1999/03/10 02:50:31 jkh Exp $
*/
#include "sysinstall.h"
#include <sys/sysctl.h>
-#include "i386/isa/isa_device.h"
-#include "i386/isa/pnp.h"
+#include <isa/isa_device.h>
+#include <isa/pnp.h>
int
kget(char *out)
{
- int len, i, bytes_written = 0;
+ int len, i, bytes_written;
char *buf;
- char *mib = "machdep.uc_devlist";
+ char *mib1 = "machdep.uc_devlist";
char *mib2 = "machdep.uc_pnplist";
char name[9];
FILE *fout;
@@ -44,33 +44,41 @@ kget(char *out)
struct pnp_cinfo *c;
char *p;
- fout = fopen(out, "w");
- if (fout == NULL) {
- msgDebug("kget: Unable to open %s for writing.\n", out);
- return -1;
- }
-
/* We use sysctlbyname, because the oid is unknown (OID_AUTO) */
/* get the buffer size */
- i = sysctlbyname(mib, NULL, &len, NULL, NULL);
+ i = sysctlbyname(mib1, NULL, &len, NULL, NULL);
if (i) {
msgDebug("kget: error buffer sizing\n");
return -1;
}
- buf = (char *)malloc(len * sizeof(char));
- i = sysctlbyname(mib, buf, &len, NULL, NULL);
+ if (len <= 0) {
+ msgDebug("kget: mib1 has length of %d\n", len);
+ return -1;
+ }
+ buf = (char *)alloca(len * sizeof(char));
+ i = sysctlbyname(mib1, buf, &len, NULL, NULL);
if (i) {
msgDebug("kget: error retrieving data\n");
return -1;
}
- i = 0;
+
+ /* now it's time to create the output file; if we end up not writing to
+ it, we'll unlink() it later. */
+ fout = fopen(out, "w");
+ if (fout == NULL) {
+ msgDebug("kget: Unable to open %s for writing.\n", out);
+ return -1;
+ }
+
+ i = bytes_written = 0;
while (i < len) {
id = (struct isa_device *)(buf + i);
p = (buf + i + sizeof(struct isa_device));
strncpy(name, p, 8);
if (!id->id_enabled) {
bytes_written += fprintf(fout, "di %s%d\n", name, id->id_unit);
- } else {
+ }
+ else {
bytes_written += fprintf(fout, "en %s%d\n", name, id->id_unit);
if (id->id_iobase > 0) {
bytes_written += fprintf(fout, "po %s%d %#x\n",
@@ -97,7 +105,6 @@ kget(char *out)
}
i += sizeof(struct isa_device) + 8;
}
- free(buf), buf = NULL;
/* Now, print the changes to PnP override table */
i = sysctlbyname(mib2, NULL, &len, NULL, NULL);
if (i) {
@@ -105,14 +112,19 @@ kget(char *out)
msgDebug("kget: can't get PnP data - skipping...\n");
goto bail;
}
- buf = (char *)malloc(len * sizeof(char));
+ if (len <= 0) {
+ msgDebug("kget: PnP data has length of %d\n", len);
+ goto bail;
+ }
+ buf = (char *)alloca(len * sizeof(char));
i = sysctlbyname(mib2, buf, &len, NULL, NULL);
if (i) {
- msgDebug("kget: error retrieving data\n");
+ msgDebug("kget: error retrieving data mib2\n");
goto bail;
}
- i = 0;
/* Print the PnP override table. Taken from userconfig.c */
+
+ i = 0;
do {
c = (struct pnp_cinfo *)(buf + i);
if (c->csn >0 && c->csn != 255) {
@@ -143,9 +155,10 @@ kget(char *out)
}
} while ((i += sizeof(struct pnp_cinfo)) < len);
bail:
- fprintf(fout, "q\n");
+ if (bytes_written)
+ fprintf(fout, "q\n");
+ else
+ unlink(out);
fclose(fout);
- if (buf)
- free(buf);
return 0;
}