Browse Source

Merge pull request #15404 from vbatts/vbatts-dm-zero-sized-field

devicemapper: fix zero-sized field access
Alexander Morozov 10 years ago
parent
commit
6f89a8ee1b
2 changed files with 24 additions and 8 deletions
  1. 9 5
      daemon/graphdriver/devmapper/deviceset.go
  2. 15 3
      pkg/devicemapper/devmapper_wrapper.go

+ 9 - 5
daemon/graphdriver/devmapper/deviceset.go

@@ -1509,12 +1509,16 @@ func (devices *DeviceSet) deactivatePool() error {
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
-	if d, err := devicemapper.GetDeps(devname); err == nil {
-		// Access to more Debug output
-		logrus.Debugf("[devmapper] devicemapper.GetDeps() %s: %#v", devname, d)
+
+	if devinfo.Exists == 0 {
+		return nil
 	}
 	}
-	if devinfo.Exists != 0 {
-		return devicemapper.RemoveDevice(devname)
+	if err := devicemapper.RemoveDevice(devname); err != nil {
+		return err
+	}
+
+	if d, err := devicemapper.GetDeps(devname); err == nil {
+		logrus.Warnf("[devmapper] device %s still has %d active dependents", devname, d.Count)
 	}
 	}
 
 
 	return nil
 	return nil

+ 15 - 3
pkg/devicemapper/devmapper_wrapper.go

@@ -38,7 +38,10 @@ static void	log_with_errno_init()
 */
 */
 import "C"
 import "C"
 
 
-import "unsafe"
+import (
+	"reflect"
+	"unsafe"
+)
 
 
 type (
 type (
 	CDmTask C.struct_dm_task
 	CDmTask C.struct_dm_task
@@ -184,12 +187,21 @@ func dmTaskGetDepsFct(task *CDmTask) *Deps {
 	if Cdeps == nil {
 	if Cdeps == nil {
 		return nil
 		return nil
 	}
 	}
+
+	// golang issue: https://github.com/golang/go/issues/11925
+	hdr := reflect.SliceHeader{
+		Data: uintptr(unsafe.Pointer(uintptr(unsafe.Pointer(Cdeps)) + unsafe.Sizeof(*Cdeps))),
+		Len:  int(Cdeps.count),
+		Cap:  int(Cdeps.count),
+	}
+	devices := *(*[]C.uint64_t)(unsafe.Pointer(&hdr))
+
 	deps := &Deps{
 	deps := &Deps{
 		Count:  uint32(Cdeps.count),
 		Count:  uint32(Cdeps.count),
 		Filler: uint32(Cdeps.filler),
 		Filler: uint32(Cdeps.filler),
 	}
 	}
-	for _, device := range Cdeps.device {
-		deps.Device = append(deps.Device, (uint64)(device))
+	for _, device := range devices {
+		deps.Device = append(deps.Device, uint64(device))
 	}
 	}
 	return deps
 	return deps
 }
 }