Develop and Download Open Source Software

Browse Subversion Repository

Diff of /branches/ssh_chacha20poly1305/ttssh2/ttxssh/ssh.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 8437 by doda, Fri Dec 13 03:11:16 2019 UTC revision 8600 by doda, Mon Mar 16 15:20:53 2020 UTC
# Line 205  static Channel_t *ssh2_channel_new(unsig Line 205  static Channel_t *ssh2_channel_new(unsig
205          memset(c, 0, sizeof(Channel_t));          memset(c, 0, sizeof(Channel_t));
206          c->used = 1;          c->used = 1;
207          c->self_id = i;          c->self_id = i;
208          c->remote_id = -1;          c->remote_id = SSH_CHANNEL_INVALID;
209          c->local_window = window;          c->local_window = window;
210          c->local_window_max = window;          c->local_window_max = window;
211          c->local_consumed = 0;          c->local_consumed = 0;
# Line 3046  void SSH_notify_win_size(PTInstVar pvar, Line 3046  void SSH_notify_win_size(PTInstVar pvar,
3046                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);
3047                          return;                          return;
3048                  }                  }
3049                    if (c->remote_id == SSH_CHANNEL_INVALID) {
3050                            // この状況は認証完了直後にウィンドウサイズを変更すると発生する。
3051                            // まだシェルのチャネルに対する SSH_MSG_OPEN_CONFIRMATION を受けていないので、
3052                            // 相手側のチャネル番号が判らないので window-change メッセージは送らない。
3053                            logprintf(LOG_LEVEL_WARNING, "%s: remote shell channel number is unknown.", __FUNCTION__);
3054                            return;
3055                    }
3056    
3057                  msg = buffer_init();                  msg = buffer_init();
3058                  if (msg == NULL) {                  if (msg == NULL) {
                         // TODO: error check  
3059                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
3060                          return;                          return;
3061                  }                  }
# Line 3095  int SSH_notify_break_signal(PTInstVar pv Line 3100  int SSH_notify_break_signal(PTInstVar pv
3100                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);
3101                          goto error;                          goto error;
3102                  }                  }
3103                    if (c->remote_id == SSH_CHANNEL_INVALID) {
3104                            // 認証直後に send break を行うと発生する
3105                            // まだシェルのチャネルに対する SSH_MSG_OPEN_CONFIRMATION を受けていないので、
3106                            // 相手側のチャネル番号が判らないので break メッセージは送らない。
3107                            logprintf(LOG_LEVEL_WARNING, "%s: remote shell channel number is unknown.", __FUNCTION__);
3108                            goto error;
3109                    }
3110    
3111                  msg = buffer_init();                  msg = buffer_init();
3112                  if (msg == NULL) {                  if (msg == NULL) {
# Line 3244  void SSH_send(PTInstVar pvar, unsigned c Line 3256  void SSH_send(PTInstVar pvar, unsigned c
3256    
3257          } else { // for SSH2(yutaka)          } else { // for SSH2(yutaka)
3258                  Channel_t *c = ssh2_channel_lookup(pvar->shell_id);                  Channel_t *c = ssh2_channel_lookup(pvar->shell_id);
3259                  if (c == NULL) {                  if (c == NULL || c->remote_id == SSH_CHANNEL_INVALID) {
3260                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);
3261                  }                  }
3262                  else {                  else {
# Line 3457  void SSH_end(PTInstVar pvar) Line 3469  void SSH_end(PTInstVar pvar)
3469                  pvar->session_id_len = 0;                  pvar->session_id_len = 0;
3470    
3471                  pvar->userauth_success = 0;                  pvar->userauth_success = 0;
                 //pvar->remote_id = 0;  
3472                  pvar->shell_id = SSH_CHANNEL_INVALID;                  pvar->shell_id = SSH_CHANNEL_INVALID;
3473                  pvar->session_nego_status = 0;                  pvar->session_nego_status = 0;
3474    
# Line 3537  void SSH2_send_channel_data(PTInstVar pv Line 3548  void SSH2_send_channel_data(PTInstVar pv
3548          if (buflen > 0) {          if (buflen > 0) {
3549                  msg = buffer_init();                  msg = buffer_init();
3550                  if (msg == NULL) {                  if (msg == NULL) {
                         // TODO: error check  
3551                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
3552                          return;                          return;
3553                  }                  }
# Line 3666  void SSH2_confirm_channel_open(PTInstVar Line 3676  void SSH2_confirm_channel_open(PTInstVar
3676    
3677          msg = buffer_init();          msg = buffer_init();
3678          if (msg == NULL) {          if (msg == NULL) {
                 // TODO: error check  
3679                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
3680                  return;                  return;
3681          }          }
# Line 3745  void SSH2_channel_input_eof(PTInstVar pv Line 3754  void SSH2_channel_input_eof(PTInstVar pv
3754    
3755          msg = buffer_init();          msg = buffer_init();
3756          if (msg == NULL) {          if (msg == NULL) {
                 // TODO: error check  
3757                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
3758                  return;                  return;
3759          }          }
# Line 3914  void SSH_request_X11_forwarding(PTInstVa Line 3922  void SSH_request_X11_forwarding(PTInstVa
3922    
3923                  msg = buffer_init();                  msg = buffer_init();
3924                  if (msg == NULL) {                  if (msg == NULL) {
                         // TODO: error check  
3925                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
3926                          return;                          return;
3927                  }                  }
# Line 3924  void SSH_request_X11_forwarding(PTInstVa Line 3931  void SSH_request_X11_forwarding(PTInstVa
3931                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);
3932                          return;                          return;
3933                  }                  }
3934                    if (c->remote_id == SSH_CHANNEL_INVALID) {
3935                            logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__);
3936                            return;
3937                    }
3938    
3939                  // making the fake data                  // making the fake data
3940                  newlen = 2 * auth_data_len + 1;                  newlen = 2 * auth_data_len + 1;
# Line 8093  static BOOL send_channel_request_gen(PTI Line 8104  static BOOL send_channel_request_gen(PTI
8104    
8105          msg = buffer_init();          msg = buffer_init();
8106          if (msg == NULL) {          if (msg == NULL) {
8107                    logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
8108                    return FALSE;
8109            }
8110            if (c->remote_id == SSH_CHANNEL_INVALID) {
8111                    logprintf(LOG_LEVEL_ERROR, "%s: invalid remote channel number (%d).", __FUNCTION__, c->remote_id);
8112                  return FALSE;                  return FALSE;
8113          }          }
8114    
# Line 8135  BOOL send_pty_request(PTInstVar pvar, Ch Line 8151  BOOL send_pty_request(PTInstVar pvar, Ch
8151          // pty open          // pty open
8152          msg = buffer_init();          msg = buffer_init();
8153          if (msg == NULL) {          if (msg == NULL) {
                 // TODO: error check  
8154                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL. (msg)", __FUNCTION__);                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL. (msg)", __FUNCTION__);
8155                  return FALSE;                  return FALSE;
8156          }          }
8157          ttymsg = buffer_init();          ttymsg = buffer_init();
8158          if (ttymsg == NULL) {          if (ttymsg == NULL) {
                 // TODO: error check  
8159                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL. (ttymsg)", __FUNCTION__);                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL. (ttymsg)", __FUNCTION__);
8160                  buffer_free(msg);                  buffer_free(msg);
8161                  return FALSE;                  return FALSE;
# Line 8241  static BOOL handle_SSH2_open_confirm(PTI Line 8255  static BOOL handle_SSH2_open_confirm(PTI
8255    
8256          c = ssh2_channel_lookup(id);          c = ssh2_channel_lookup(id);
8257          if (c == NULL) {          if (c == NULL) {
                 // TODO:  
8258                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);
8259                  return FALSE;                  return FALSE;
8260          }          }
8261    
         // TODO: id check  
8262          remote_id = get_uint32_MSBfirst(data);          remote_id = get_uint32_MSBfirst(data);
8263          data += 4;          data += 4;
8264    
# Line 8355  static BOOL handle_SSH2_open_failure(PTI Line 8367  static BOOL handle_SSH2_open_failure(PTI
8367    
8368          c = ssh2_channel_lookup(id);          c = ssh2_channel_lookup(id);
8369          if (c == NULL) {          if (c == NULL) {
                 // TODO: SSH2_MSG_DISCONNECTを送る  
8370                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);
8371                  return FALSE;                  return FALSE;
8372          }          }
# Line 8498  static BOOL handle_SSH2_channel_success( Line 8509  static BOOL handle_SSH2_channel_success(
8509                  pvar->session_nego_status);                  pvar->session_nego_status);
8510    
8511          if (pvar->session_nego_status == 1) {          if (pvar->session_nego_status == 1) {
                 // find channel by shell id(2005.2.27 yutaka)  
8512                  c = ssh2_channel_lookup(pvar->shell_id);                  c = ssh2_channel_lookup(pvar->shell_id);
8513                  if (c == NULL) {                  if (c == NULL) {
                         // TODO: error check  
8514                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);
8515                          return FALSE;                          return FALSE;
8516                  }                  }
8517                    if (c->remote_id == SSH_CHANNEL_INVALID) {
8518                            logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__);
8519                            return FALSE;
8520                    }
8521                  pvar->agentfwd_enable = TRUE;                  pvar->agentfwd_enable = TRUE;
8522                  return send_pty_request(pvar, c);                  return send_pty_request(pvar, c);
8523    
8524          } else if (pvar->session_nego_status == 2) {          } else if (pvar->session_nego_status == 2) {
8525                  pvar->session_nego_status = 3;                  pvar->session_nego_status = 3;
8526    
                 // find channel by shell id(2005.2.27 yutaka)  
8527                  c = ssh2_channel_lookup(pvar->shell_id);                  c = ssh2_channel_lookup(pvar->shell_id);
8528                  if (c == NULL) {                  if (c == NULL) {
                         // TODO: error check  
8529                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: shell channel not found.", __FUNCTION__);
8530                          return FALSE;                          return FALSE;
8531                  }                  }
8532                    if (c->remote_id == SSH_CHANNEL_INVALID) {
8533                            logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__);
8534                            return FALSE;
8535                    }
8536    
8537                  if (!send_channel_request_gen(pvar, c, "shell", want_reply, NULL, NULL)) {                  if (!send_channel_request_gen(pvar, c, "shell", want_reply, NULL, NULL)) {
8538                          return FALSE;;                          return FALSE;;
# Line 8550  static BOOL handle_SSH2_channel_failure( Line 8565  static BOOL handle_SSH2_channel_failure(
8565    
8566          c = ssh2_channel_lookup(channel_id);          c = ssh2_channel_lookup(channel_id);
8567          if (c == NULL) {          if (c == NULL) {
                 // TODO: error check  
8568                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, channel_id);                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, channel_id);
8569                  return FALSE;                  return FALSE;
8570          }          }
# Line 8599  static void do_SSH2_adjust_window_size(P Line 8613  static void do_SSH2_adjust_window_size(P
8613                  // pty open                  // pty open
8614                  msg = buffer_init();                  msg = buffer_init();
8615                  if (msg == NULL) {                  if (msg == NULL) {
                         // TODO: error check  
8616                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
8617                          return;                          return;
8618                  }                  }
# Line 8635  void ssh2_channel_send_close(PTInstVar p Line 8648  void ssh2_channel_send_close(PTInstVar p
8648                  // SSH2 serverにchannel closeを伝える                  // SSH2 serverにchannel closeを伝える
8649                  msg = buffer_init();                  msg = buffer_init();
8650                  if (msg == NULL) {                  if (msg == NULL) {
                         // TODO: error check  
8651                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
8652                          return;                          return;
8653                  }                  }
# Line 9315  static BOOL handle_SSH2_channel_data(PTI Line 9327  static BOOL handle_SSH2_channel_data(PTI
9327    
9328          c = ssh2_channel_lookup(id);          c = ssh2_channel_lookup(id);
9329          if (c == NULL) {          if (c == NULL) {
                 // TODO:  
9330                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);
9331                  return FALSE;                  return FALSE;
9332          }          }
9333            if (c->remote_id == SSH_CHANNEL_INVALID) {
9334                    logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__);
9335                    return FALSE;
9336            }
9337    
9338          // string length          // string length
9339          str_len = get_uint32_MSBfirst(data);          str_len = get_uint32_MSBfirst(data);
# Line 9336  static BOOL handle_SSH2_channel_data(PTI Line 9351  static BOOL handle_SSH2_channel_data(PTI
9351                          "len:%d local_maxpacket:%d", __FUNCTION__, str_len, c->local_maxpacket);                          "len:%d local_maxpacket:%d", __FUNCTION__, str_len, c->local_maxpacket);
9352          }          }
9353          if (str_len > c->local_window) {          if (str_len > c->local_window) {
                 // TODO: logging  
9354                  // local window sizeより大きなパケットは捨てる                  // local window sizeより大きなパケットは捨てる
9355                  logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_window. "                  logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_window. "
9356                          "len:%d local_window:%d", __FUNCTION__, str_len, c->local_window);                          "len:%d local_window:%d", __FUNCTION__, str_len, c->local_window);
# Line 9400  static BOOL handle_SSH2_channel_extended Line 9414  static BOOL handle_SSH2_channel_extended
9414    
9415          c = ssh2_channel_lookup(id);          c = ssh2_channel_lookup(id);
9416          if (c == NULL) {          if (c == NULL) {
                 // TODO:  
9417                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);
9418                  return FALSE;                  return FALSE;
9419          }          }
9420            if (c->remote_id == SSH_CHANNEL_INVALID) {
9421                    logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__);
9422                    return FALSE;
9423            }
9424    
9425          // data_type_code          // data_type_code
9426          data_type = get_uint32_MSBfirst(data);          data_type = get_uint32_MSBfirst(data);
# Line 9415  static BOOL handle_SSH2_channel_extended Line 9432  static BOOL handle_SSH2_channel_extended
9432    
9433          // バッファサイズのチェック          // バッファサイズのチェック
9434          if (strlen > c->local_maxpacket) {          if (strlen > c->local_maxpacket) {
                 // TODO: logging  
9435                  logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_maxpacket. "                  logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_maxpacket. "
9436                          "len:%d local_maxpacket:%d", __FUNCTION__, strlen, c->local_maxpacket);                          "len:%d local_maxpacket:%d", __FUNCTION__, strlen, c->local_maxpacket);
9437          }          }
9438          if (strlen > c->local_window) {          if (strlen > c->local_window) {
                 // TODO: logging  
9439                  // local window sizeより大きなパケットは捨てる                  // local window sizeより大きなパケットは捨てる
9440                  logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_window. "                  logprintf(LOG_LEVEL_WARNING, "%s: Data length is larger than local_window. "
9441                          "len:%d local_window:%d", __FUNCTION__, strlen, c->local_window);                          "len:%d local_window:%d", __FUNCTION__, strlen, c->local_window);
# Line 9478  static BOOL handle_SSH2_channel_eof(PTIn Line 9493  static BOOL handle_SSH2_channel_eof(PTIn
9493    
9494          c = ssh2_channel_lookup(id);          c = ssh2_channel_lookup(id);
9495          if (c == NULL) {          if (c == NULL) {
                 // TODO:  
9496                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);
9497                  return FALSE;                  return FALSE;
9498          }          }
# Line 9596  static BOOL handle_SSH2_channel_open(PTI Line 9610  static BOOL handle_SSH2_channel_open(PTI
9610    
9611                  free(orig_str);                  free(orig_str);
9612    
9613                  // X server(port 6000)へ接続する。接続に失敗するとTera Term自身が切断される。                  // X server へ接続する。
                 // TODO: 将来、切断されないようにしたい。(2005.7.3 yutaka)  
9614                  FWD_X11_open(pvar, remote_id, NULL, 0, &chan_num);                  FWD_X11_open(pvar, remote_id, NULL, 0, &chan_num);
9615    
9616                  // channelをアロケートし、必要な情報(remote window size)をここで取っておく。                  // channelをアロケートし、必要な情報(remote window size)をここで取っておく。
# Line 9634  static BOOL handle_SSH2_channel_open(PTI Line 9647  static BOOL handle_SSH2_channel_open(PTI
9647                  else {                  else {
9648                          msg = buffer_init();                          msg = buffer_init();
9649                          if (msg == NULL) {                          if (msg == NULL) {
                                 // TODO: error check  
9650                                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);                                  logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
9651                                  return FALSE;                                  return FALSE;
9652                          }                          }
# Line 9684  static BOOL handle_SSH2_channel_close(PT Line 9696  static BOOL handle_SSH2_channel_close(PT
9696          data += 4;          data += 4;
9697          c = ssh2_channel_lookup(id);          c = ssh2_channel_lookup(id);
9698          if (c == NULL) {          if (c == NULL) {
                 // TODO:  
9699                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);
9700                  return FALSE;                  return FALSE;
9701          }          }
# Line 9744  static BOOL handle_SSH2_channel_request( Line 9755  static BOOL handle_SSH2_channel_request(
9755          data += 4;          data += 4;
9756          c = ssh2_channel_lookup(id);          c = ssh2_channel_lookup(id);
9757          if (c == NULL) {          if (c == NULL) {
                 // TODO:  
9758                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);                  logprintf(LOG_LEVEL_ERROR, "%s: channel not found. (%d)", __FUNCTION__, id);
9759                  return FALSE;                  return FALSE;
9760          }          }
9761            if (c->remote_id == SSH_CHANNEL_INVALID) {
9762                    logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__);
9763                    return FALSE;
9764            }
9765    
9766          request = buffer_get_string(&data, NULL);          request = buffer_get_string(&data, NULL);
9767    
# Line 9790  static BOOL handle_SSH2_channel_request( Line 9804  static BOOL handle_SSH2_channel_request(
9804    
9805                  msg = buffer_init();                  msg = buffer_init();
9806                  if (msg == NULL) {                  if (msg == NULL) {
                         // TODO: error check  
9807                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);                          logprintf(LOG_LEVEL_ERROR, "%s: buffer_init returns NULL.", __FUNCTION__);
9808                          return FALSE;                          return FALSE;
9809                  }                  }
# Line 9841  static BOOL handle_SSH2_window_adjust(PT Line 9854  static BOOL handle_SSH2_window_adjust(PT
9854                  logprintf(LOG_LEVEL_WARNING, "%s: channel not found. (%d)", __FUNCTION__, id);                  logprintf(LOG_LEVEL_WARNING, "%s: channel not found. (%d)", __FUNCTION__, id);
9855                  return TRUE;                  return TRUE;
9856          }          }
9857            if (c->remote_id == SSH_CHANNEL_INVALID) {
9858                    logprintf(LOG_LEVEL_ERROR, "%s: remote shell channel number is unknown.", __FUNCTION__);
9859                    return FALSE;
9860            }
9861    
9862          adjust = get_uint32_MSBfirst(data);          adjust = get_uint32_MSBfirst(data);
9863          data += 4;          data += 4;

Legend:
Removed from v.8437  
changed lines
  Added in v.8600

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26