Issue #7242: On Solaris 9 and earlier calling os.fork() from within a
thread could raise an incorrect RuntimeError about not holding the import
lock.  The import lock is now reinitialized after fork.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 46053fe..45128d3 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -3605,14 +3605,18 @@
 posix_fork1(PyObject *self, PyObject *noargs)
 {
 	pid_t pid;
-	int result;
+	int result = 0;
 	_PyImport_AcquireLock();
 	pid = fork1();
-	result = _PyImport_ReleaseLock();
+	if (pid == 0) {
+		/* child: this clobbers and resets the import lock. */
+		PyOS_AfterFork();
+	} else {
+		/* parent: release the import lock. */
+		result = _PyImport_ReleaseLock();
+	}
 	if (pid == -1)
 		return posix_error();
-	if (pid == 0)
-		PyOS_AfterFork();
 	if (result < 0) {
 		/* Don't clobber the OSError if the fork failed. */
 		PyErr_SetString(PyExc_RuntimeError,
@@ -3634,14 +3638,18 @@
 posix_fork(PyObject *self, PyObject *noargs)
 {
 	pid_t pid;
-	int result;
+	int result = 0;
 	_PyImport_AcquireLock();
 	pid = fork();
-	result = _PyImport_ReleaseLock();
+	if (pid == 0) {
+		/* child: this clobbers and resets the import lock. */
+		PyOS_AfterFork();
+	} else {
+		/* parent: release the import lock. */
+		result = _PyImport_ReleaseLock();
+	}
 	if (pid == -1)
 		return posix_error();
-	if (pid == 0)
-		PyOS_AfterFork();
 	if (result < 0) {
 		/* Don't clobber the OSError if the fork failed. */
 		PyErr_SetString(PyExc_RuntimeError,
@@ -3759,11 +3767,12 @@
 
 	_PyImport_AcquireLock();
 	pid = forkpty(&master_fd, NULL, NULL, NULL);
+	if (pid == 0)
+		PyOS_AfterFork();
+
 	result = _PyImport_ReleaseLock();
 	if (pid == -1)
 		return posix_error();
-	if (pid == 0)
-		PyOS_AfterFork();
 	if (result < 0) {
 		/* Don't clobber the OSError if the fork failed. */
 		PyErr_SetString(PyExc_RuntimeError,