[exec] Avoid destroying launchpad structure when already freed by launchpad_go

ZX-1174 #done
ZX-1220 #done

Change-Id: Icba5f620923568d8a88aa20cb52c2f21f91aacea
diff --git a/src/os/exec_fuchsia_cgo.go b/src/os/exec_fuchsia_cgo.go
index e10590d..25b446c 100644
--- a/src/os/exec_fuchsia_cgo.go
+++ b/src/os/exec_fuchsia_cgo.go
@@ -158,7 +158,11 @@
 	if status != zx.ErrOk {
 		return 0, errors.New("launchpad_create")
 	}
-	defer C.launchpad_destroy(lp)
+	defer func() {
+		if lp != nil {
+			C.launchpad_destroy(lp)
+		}
+	}()
 	status = zx.Status(C.launchpad_load_from_file(lp, nameC))
 	if status != zx.ErrOk {
 		return 0, errors.New("loading vdso")
@@ -193,6 +197,8 @@
 	}
 	h := C.zx_handle_t(0)
 	status = zx.Status(C.launchpad_go(lp, &h, nil))
+	// lp is freed by launchpad_go unconditionally
+	lp = nil
 	if status < 0 {
 		return 0, errors.New("launchpad error")
 	}