Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Aug 2009 06:16:54 GMT
From:      "Andrey V. Elsukov" <bu7cher@yandex.ru>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   bin/137656: [geom][patch] gpart drops core when adding partition to non-existent geom
Message-ID:  <200908110616.n7B6GsE4017102@www.freebsd.org>
Resent-Message-ID: <200908110620.n7B6K2x9024519@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         137656
>Category:       bin
>Synopsis:       [geom][patch] gpart drops core when adding partition to non-existent geom
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Aug 11 06:20:02 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     Andrey V. Elsukov
>Release:        8.0-BETA2
>Organization:
>Environment:
8.0-BETA2 FreeBSD 8.0-BETA2 #0: Wed Jul 15 21:48:41 UTC 2009     root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64

>Description:
gpart crashes when adding partitions to non-existent geom.
Problem is in gpart_autofill function. It doesn't check returned value after calling find_geom(). And next function doing access to NULL pointer.

>How-To-Repeat:
> gpart show
=>       34  312581741  ad4  GPT  (149G)
         34        256    1  freebsd-boot  (128K)
        290    4194304    2  freebsd-swap  (2.0G)
    4194594  125829120    3  freebsd-zfs  (60G)
  130023714  182558061       - free -  (87G)
> sudo gpart add -t freebsd-zfs ad6
Segmentation fault (core dumped)

>Fix:
After my patch:
> sudo ./gpart add -t freebsd-zfs ad6
gpart: No such geom: ad6.


Patch attached with submission follows:

--- src/sbin/geom/class/part/geom_part.c	2009-07-14 12:54:23.444482747 +0400
+++ src/sbin/geom/class/part/geom_part.c	2009-08-11 09:58:13.246739711 +0400
@@ -275,7 +275,10 @@
 	if (error)
 		return (error);
 	cp = find_class(&mesh, gctl_get_ascii(req, "class"));
-	gp = find_geom(cp, gctl_get_ascii(req, "geom"));
+	s = gctl_get_ascii(req, "geom");
+	gp = find_geom(cp, s);
+	if (gp == NULL)
+		errx(EXIT_FAILURE, "No such geom: %s.", s);
 	first = atoll(find_geomcfg(gp, "first"));
 	last = atoll(find_geomcfg(gp, "last"));
 	grade = ~0ULL;


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908110616.n7B6GsE4017102>