PageRenderTime 52ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/package/ppp/patches/426-pptp-segfault.patch

https://gitlab.com/BGCX262/zyxel-keenetic-packages-svn-to-git
Patch | 164 lines | 157 code | 7 blank | 0 comment | 0 complexity | b795e0db3c702db82d956e3853093f20 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-2.1, AGPL-1.0
  1. diff -U 3 -dHBbrN -- ppp-2.4.4.orig/pppd/plugins/pptp/pptp.c ppp-2.4.4/pppd/plugins/pptp/pptp.c
  2. --- ppp-2.4.4.orig/pppd/plugins/pptp/pptp.c 2010-06-17 23:30:10.000000000 +0400
  3. +++ ppp-2.4.4/pppd/plugins/pptp/pptp.c 2010-06-17 23:30:16.543257647 +0400
  4. @@ -119,7 +119,7 @@
  5. }
  6. static int pptp_start_client(void)
  7. {
  8. - int len;
  9. + socklen_t len;
  10. struct sockaddr_pppox src_addr,dst_addr;
  11. struct hostent *hostinfo;
  12. @@ -143,6 +143,7 @@
  13. if (connect(sock,(struct sockaddr*)&addr,sizeof(addr)))
  14. {
  15. fatal("PPTP: connect failed (%s)\n",strerror(errno));
  16. + close(sock);
  17. return -1;
  18. }
  19. getsockname(sock,(struct sockaddr*)&addr,&len);
  20. @@ -171,6 +172,7 @@
  21. if (bind(pptp_fd,(struct sockaddr*)&src_addr,sizeof(src_addr)))
  22. {
  23. fatal("PPTP: failed to bind PPTP socket (%s)\n",strerror(errno));
  24. + close(pptp_fd);
  25. return -1;
  26. }
  27. len=sizeof(src_addr);
  28. @@ -182,12 +184,19 @@
  29. * Open connection to call manager (Launch call manager if necessary.)
  30. */
  31. callmgr_sock = open_callmgr(src_addr.sa_addr.pptp.call_id,dst_addr.sa_addr.pptp.sin_addr, pptp_phone,50);
  32. + if (callmgr_sock<0)
  33. + {
  34. + close(pptp_fd);
  35. + return -1;
  36. + }
  37. /* Exchange PIDs, get call ID */
  38. } while (get_call_id(callmgr_sock, getpid(), getpid(), &dst_addr.sa_addr.pptp.call_id) < 0);
  39. if (connect(pptp_fd,(struct sockaddr*)&dst_addr,sizeof(dst_addr)))
  40. {
  41. fatal("PPTP: failed to connect PPTP socket (%s)\n",strerror(errno));
  42. + close(callmgr_sock);
  43. + close(pptp_fd);
  44. return -1;
  45. }
  46. @@ -209,6 +218,7 @@
  47. static void pptp_disconnect(void)
  48. {
  49. + if (pptp_server) close(callmgr_sock);
  50. close(pptp_fd);
  51. }
  52. @@ -243,7 +253,7 @@
  53. case 0: /* child */
  54. {
  55. close (fd);
  56. - //close(pptp_fd);
  57. + close(pptp_fd);
  58. /* close the pty and gre in the call manager */
  59. // close(pty_fd);
  60. //close(gre_fd);
  61. @@ -251,8 +261,11 @@
  62. }
  63. default: /* parent */
  64. waitpid(pid, &status, 0);
  65. - if (status!= 0)
  66. + if (status!= 0) {
  67. fatal("Call manager exited with error %d", status);
  68. + close(fd);
  69. + return -1;
  70. + }
  71. break;
  72. }
  73. sleep(1);
  74. diff -U 3 -dHBbrN -- ppp-2.4.4.orig/pppd/plugins/pptp/pptp_callmgr.c ppp-2.4.4/pppd/plugins/pptp/pptp_callmgr.c
  75. --- ppp-2.4.4.orig/pppd/plugins/pptp/pptp_callmgr.c 2010-06-17 23:30:10.000000000 +0400
  76. +++ ppp-2.4.4/pppd/plugins/pptp/pptp_callmgr.c 2010-06-17 23:31:32.855228935 +0400
  77. @@ -184,6 +184,7 @@
  78. do {
  79. int rc;
  80. fd_set read_set = call_set, write_set;
  81. + if( pptp_conn_is_dead(conn) ) break;
  82. FD_ZERO (&write_set);
  83. if (pptp_conn_established(conn)) {
  84. FD_SET (unix_sock, &read_set);
  85. @@ -311,6 +312,7 @@
  86. }
  87. /* with extreme prejudice */
  88. pptp_conn_destroy(conn);
  89. + pptp_conn_free(conn);
  90. vector_destroy(call_list);
  91. }
  92. cleanup:
  93. diff -U 3 -dHBbrN -- ppp-2.4.4.orig/pppd/plugins/pptp/pptp_ctrl.c ppp-2.4.4/pppd/plugins/pptp/pptp_ctrl.c
  94. --- ppp-2.4.4.orig/pppd/plugins/pptp/pptp_ctrl.c 2010-06-17 23:30:10.000000000 +0400
  95. +++ ppp-2.4.4/pppd/plugins/pptp/pptp_ctrl.c 2010-06-17 23:30:16.547229940 +0400
  96. @@ -59,7 +59,7 @@
  97. int inet_sock;
  98. /* Connection States */
  99. enum {
  100. - CONN_IDLE, CONN_WAIT_CTL_REPLY, CONN_WAIT_STOP_REPLY, CONN_ESTABLISHED
  101. + CONN_IDLE, CONN_WAIT_CTL_REPLY, CONN_WAIT_STOP_REPLY, CONN_ESTABLISHED, CONN_DEAD
  102. } conn_state; /* on startup: CONN_IDLE */
  103. /* Keep-alive states */
  104. enum {
  105. @@ -439,6 +439,8 @@
  106. int i;
  107. assert(conn != NULL); assert(conn->call != NULL);
  108. /* destroy all open calls */
  109. +
  110. + if( !pptp_conn_is_dead(conn) ) {
  111. for (i = 0; i < vector_size(conn->call); i++)
  112. pptp_call_destroy(conn, vector_get_Nth(conn->call, i));
  113. /* notify */
  114. @@ -447,6 +449,15 @@
  115. close(conn->inet_sock);
  116. /* deallocate */
  117. vector_destroy(conn->call);
  118. + conn->conn_state = CONN_DEAD;
  119. + }
  120. +}
  121. +
  122. +int pptp_conn_is_dead(PPTP_CONN * conn) {
  123. + return conn->conn_state == CONN_DEAD;
  124. +}
  125. +
  126. +void pptp_conn_free(PPTP_CONN * conn) {
  127. free(conn);
  128. }
  129. @@ -1037,10 +1048,13 @@
  130. int i;
  131. /* "Keep Alives and Timers, 1": check connection state */
  132. if (global.conn->conn_state != CONN_ESTABLISHED) {
  133. - if (global.conn->conn_state == CONN_WAIT_STOP_REPLY)
  134. + if (global.conn->conn_state == CONN_WAIT_STOP_REPLY) {
  135. /* hard close. */
  136. pptp_conn_destroy(global.conn);
  137. - else /* soft close */
  138. + return;
  139. + }
  140. +
  141. + /* soft close */
  142. pptp_conn_close(global.conn, PPTP_STOP_NONE);
  143. }
  144. /* "Keep Alives and Timers, 2": check echo status */
  145. diff -U 3 -dHBbrN -- ppp-2.4.4.orig/pppd/plugins/pptp/pptp_ctrl.h ppp-2.4.4/pppd/plugins/pptp/pptp_ctrl.h
  146. --- ppp-2.4.4.orig/pppd/plugins/pptp/pptp_ctrl.h 2010-06-17 23:30:10.000000000 +0400
  147. +++ ppp-2.4.4/pppd/plugins/pptp/pptp_ctrl.h 2010-06-17 23:30:16.547229940 +0400
  148. @@ -36,6 +36,10 @@
  149. void pptp_conn_close(PPTP_CONN * conn, u_int8_t close_reason);
  150. /* hard close */
  151. void pptp_conn_destroy(PPTP_CONN * conn);
  152. +/* dead test */
  153. +int pptp_conn_is_dead(PPTP_CONN * conn);
  154. +/* free */
  155. +void pptp_conn_free(PPTP_CONN * conn);
  156. /* Add file descriptors used by pptp to fd_set. */
  157. void pptp_fd_set(PPTP_CONN * conn, fd_set * read_set, fd_set * write_set, int *max_fd);