]> git.pld-linux.org Git - packages/mysql.git/blame - innodb_bug60788.patch
- added patch for CVE-2012-2122
[packages/mysql.git] / innodb_bug60788.patch
CommitLineData
11822e22
AM
1# name : innodb_bug60788.patch
2# maintainer : Alexey
3#
4# Fix for MySQL bug #60788: InnoDB crashes with an assertion failure when
5# receiving a signal on pwrite()
6#
7# Changes InnoDB IO code so that fsync(), pread() and pwrite() are restarted
8# when interrupted by a signal.
9#
db82db79
AM
10--- a/storage/innobase/os/os0file.c
11+++ b/storage/innobase/os/os0file.c
12@@ -2093,6 +2093,9 @@
11822e22
AM
13 failures++;
14
15 retry = TRUE;
16+ } else if (ret == -1 && errno == EINTR) {
17+ /* Handle signal interruptions correctly */
18+ retry = TRUE;
19 } else {
20
21 retry = FALSE;
db82db79 22@@ -2223,6 +2226,7 @@
11822e22
AM
23 off_t offs;
24 #if defined(HAVE_PREAD) && !defined(HAVE_BROKEN_PREAD)
25 ssize_t n_bytes;
26+ ssize_t n_read;
27 #endif /* HAVE_PREAD && !HAVE_BROKEN_PREAD */
28 ulint sec;
29 ulint ms;
db82db79 30@@ -2263,7 +2267,18 @@
11822e22
AM
31 os_n_pending_reads++;
32 os_mutex_exit(os_file_count_mutex);
33
34- n_bytes = pread(file, buf, (ssize_t)n, offs);
35+ /* Handle signal interruptions correctly */
36+ for (n_bytes = 0; n_bytes < (ssize_t) n; ) {
37+ n_read = pread(file, buf, (ssize_t)n, offs);
38+ if (n_read > 0) {
39+ n_bytes += n_read;
40+ offs += n_read;
41+ } else if (n_read == -1 && errno == EINTR) {
42+ continue;
43+ } else {
44+ break;
45+ }
46+ }
47
48 os_mutex_enter(os_file_count_mutex);
49 os_file_n_pending_preads--;
db82db79 50@@ -2282,6 +2297,7 @@
11822e22
AM
51 {
52 off_t ret_offset;
53 ssize_t ret;
54+ ssize_t n_read;
55 #ifndef UNIV_HOTBACKUP
56 ulint i;
57 #endif /* !UNIV_HOTBACKUP */
db82db79 58@@ -2302,7 +2318,17 @@
11822e22
AM
59 if (ret_offset < 0) {
60 ret = -1;
61 } else {
62- ret = read(file, buf, (ssize_t)n);
63+ /* Handle signal interruptions correctly */
64+ for (ret = 0; ret < (ssize_t) n; ) {
65+ n_read = read(file, buf, (ssize_t)n);
66+ if (n_read > 0) {
67+ ret += n_read;
68+ } else if (n_read == -1 && errno == EINTR) {
69+ continue;
70+ } else {
71+ break;
72+ }
73+ }
74 }
75
76 #ifndef UNIV_HOTBACKUP
db82db79 77@@ -2341,6 +2367,7 @@
11822e22
AM
78 offset */
79 {
80 ssize_t ret;
81+ ssize_t n_written;
82 off_t offs;
83
84 ut_a((offset & 0xFFFFFFFFUL) == offset);
db82db79 85@@ -2368,7 +2395,18 @@
11822e22
AM
86 os_n_pending_writes++;
87 os_mutex_exit(os_file_count_mutex);
88
89- ret = pwrite(file, buf, (ssize_t)n, offs);
90+ /* Handle signal interruptions correctly */
91+ for (ret = 0; ret < (ssize_t) n; ) {
92+ n_written = pwrite(file, buf, (ssize_t)n, offs);
93+ if (n_written > 0) {
94+ ret += n_written;
95+ offs += n_written;
96+ } else if (n_written == -1 && errno == EINTR) {
97+ continue;
98+ } else {
99+ break;
100+ }
101+ }
102
103 os_mutex_enter(os_file_count_mutex);
104 os_file_n_pending_pwrites--;
db82db79 105@@ -2415,7 +2453,17 @@
11822e22
AM
106 goto func_exit;
107 }
108
109- ret = write(file, buf, (ssize_t)n);
110+ /* Handle signal interruptions correctly */
111+ for (ret = 0; ret < (ssize_t) n; ) {
112+ n_written = write(file, buf, (ssize_t)n);
113+ if (n_written > 0) {
114+ ret += n_written;
115+ } else if (n_written == -1 && errno == EINTR) {
116+ continue;
117+ } else {
118+ break;
119+ }
120+ }
121
122 # ifdef UNIV_DO_FLUSH
123 if (srv_unix_file_flush_method != SRV_UNIX_LITTLESYNC
This page took 0.113513 seconds and 4 git commands to generate.