mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug#25141 Crash Server on Partitioning command
- The function build_table_filename() builds up a string unconditionally using the forward slash as a path separator. Later, when the string is searched for FN_LIBCHAR by the set_up_table_before_create() function, a null pointer is returned that is finally used by strlen in the append_file_to_dir() function which causes the crash.
This commit is contained in:
@ -1087,19 +1087,6 @@ a
|
|||||||
2
|
2
|
||||||
1
|
1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a int) engine myisam
|
|
||||||
partition by range (a)
|
|
||||||
subpartition by hash (a)
|
|
||||||
(partition p0 VALUES LESS THAN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpdata' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpinx'
|
|
||||||
(SUBPARTITION subpart00, SUBPARTITION subpart01));
|
|
||||||
Checking if file exists before alter
|
|
||||||
ALTER TABLE t1 REORGANIZE PARTITION p0 INTO
|
|
||||||
(partition p1 VALUES LESS THAN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpdata' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpinx'
|
|
||||||
(SUBPARTITION subpart10, SUBPARTITION subpart11),
|
|
||||||
partition p2 VALUES LESS THAN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpdata' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpinx'
|
|
||||||
(SUBPARTITION subpart20, SUBPARTITION subpart21));
|
|
||||||
Checking if file exists after alter
|
|
||||||
drop table t1;
|
|
||||||
create table t1 (a bigint unsigned not null, primary key(a))
|
create table t1 (a bigint unsigned not null, primary key(a))
|
||||||
engine = myisam
|
engine = myisam
|
||||||
partition by key (a)
|
partition by key (a)
|
||||||
|
27
mysql-test/r/partition_not_windows.result
Normal file
27
mysql-test/r/partition_not_windows.result
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
create table t1 (a int) engine myisam
|
||||||
|
partition by range (a)
|
||||||
|
subpartition by hash (a)
|
||||||
|
(partition p0 VALUES LESS THAN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpdata' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpinx'
|
||||||
|
(SUBPARTITION subpart00, SUBPARTITION subpart01));
|
||||||
|
Checking if file exists before alter
|
||||||
|
ALTER TABLE t1 REORGANIZE PARTITION p0 INTO
|
||||||
|
(partition p1 VALUES LESS THAN (1) DATA DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpdata' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpinx'
|
||||||
|
(SUBPARTITION subpart10, SUBPARTITION subpart11),
|
||||||
|
partition p2 VALUES LESS THAN (2) DATA DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpdata' INDEX DIRECTORY = 'MYSQLTEST_VARDIR/master-data/tmpinx'
|
||||||
|
(SUBPARTITION subpart20, SUBPARTITION subpart21));
|
||||||
|
Checking if file exists after alter
|
||||||
|
drop table t1;
|
||||||
|
DROP TABLE IF EXISTS `example`;
|
||||||
|
CREATE TABLE `example` (
|
||||||
|
`ID_EXAMPLE` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`DESCRIPTION` varchar(30) NOT NULL,
|
||||||
|
`LEVEL` smallint(5) unsigned DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`ID_EXAMPLE`)
|
||||||
|
) ENGINE = MYISAM
|
||||||
|
PARTITION BY HASH(ID_EXAMPLE)(
|
||||||
|
PARTITION p0 DATA DIRECTORY = '/build/5.1/data/partitiontest/p0Data',
|
||||||
|
PARTITION p1 DATA DIRECTORY = '/build/5.1/data/partitiontest/p1Data',
|
||||||
|
PARTITION p2 DATA DIRECTORY = '/build/5.1/data/partitiontest/p2Data',
|
||||||
|
PARTITION p3 DATA DIRECTORY = '/build/5.1/data/partitiontest/p3Data'
|
||||||
|
);
|
||||||
|
ERROR HY000: Can't create/write to file '/build/5.1/data/partitiontest/p0Data/example#P#p0.MYD' (Errcode: 2)
|
14
mysql-test/r/partition_windows.result
Normal file
14
mysql-test/r/partition_windows.result
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
DROP TABLE IF EXISTS `example`;
|
||||||
|
CREATE TABLE `example` (
|
||||||
|
`ID_EXAMPLE` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`DESCRIPTION` varchar(30) NOT NULL,
|
||||||
|
`LEVEL` smallint(5) unsigned DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`ID_EXAMPLE`)
|
||||||
|
) ENGINE = MYISAM
|
||||||
|
PARTITION BY HASH(ID_EXAMPLE)(
|
||||||
|
PARTITION p0 DATA DIRECTORY = 'C:/build/5.1/data/partitiontest/p0Data',
|
||||||
|
PARTITION p1 DATA DIRECTORY = 'C:/build/5.1/data/partitiontest/p1Data',
|
||||||
|
PARTITION p2 DATA DIRECTORY = 'C:/build/5.1/data/partitiontest/p2Data',
|
||||||
|
PARTITION p3 DATA DIRECTORY = 'C:/build/5.1/data/partitiontest/p3Data'
|
||||||
|
);
|
||||||
|
ERROR HY000: Can't create/write to file 'C:\build\5.1\data\partitiontest\p0Data\example#P#p0.MYD' (Errcode: 2)
|
@ -5,11 +5,6 @@
|
|||||||
#
|
#
|
||||||
-- source include/have_partition.inc
|
-- source include/have_partition.inc
|
||||||
|
|
||||||
#
|
|
||||||
# This test is disabled on Windows due to BUG#19107
|
|
||||||
#
|
|
||||||
-- source include/not_windows.inc
|
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
@ -1273,70 +1268,6 @@ insert into t1 values (1),(2);
|
|||||||
select * from t1 ORDER BY a DESC;
|
select * from t1 ORDER BY a DESC;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
#
|
|
||||||
# Bug 20770 Partitions: DATA DIRECTORY clause change in reorganize
|
|
||||||
# doesn't remove old directory
|
|
||||||
#
|
|
||||||
--disable_query_log
|
|
||||||
--exec mkdir $MYSQLTEST_VARDIR/master-data/tmpdata || true
|
|
||||||
eval SET @data_dir = 'DATA DIRECTORY = ''$MYSQLTEST_VARDIR/master-data/tmpdata''';
|
|
||||||
let $data_directory = `select @data_dir`;
|
|
||||||
|
|
||||||
--exec mkdir $MYSQLTEST_VARDIR/master-data/tmpinx || true
|
|
||||||
eval SET @inx_dir = 'INDEX DIRECTORY = ''$MYSQLTEST_VARDIR/master-data/tmpinx''';
|
|
||||||
let $inx_directory = `select @inx_dir`;
|
|
||||||
--enable_query_log
|
|
||||||
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
eval create table t1 (a int) engine myisam
|
|
||||||
partition by range (a)
|
|
||||||
subpartition by hash (a)
|
|
||||||
(partition p0 VALUES LESS THAN (1) $data_directory $inx_directory
|
|
||||||
(SUBPARTITION subpart00, SUBPARTITION subpart01));
|
|
||||||
|
|
||||||
--echo Checking if file exists before alter
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1.frm
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1.par
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p0#SP#subpart00.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p0#SP#subpart00.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p0#SP#subpart01.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p0#SP#subpart01.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p0#SP#subpart00.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p0#SP#subpart01.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p0#SP#subpart00.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p0#SP#subpart01.MYI
|
|
||||||
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
eval ALTER TABLE t1 REORGANIZE PARTITION p0 INTO
|
|
||||||
(partition p1 VALUES LESS THAN (1) $data_directory $inx_directory
|
|
||||||
(SUBPARTITION subpart10, SUBPARTITION subpart11),
|
|
||||||
partition p2 VALUES LESS THAN (2) $data_directory $inx_directory
|
|
||||||
(SUBPARTITION subpart20, SUBPARTITION subpart21));
|
|
||||||
|
|
||||||
--echo Checking if file exists after alter
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1.frm
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1.par
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p1#SP#subpart10.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p1#SP#subpart10.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p1#SP#subpart11.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p1#SP#subpart11.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p2#SP#subpart20.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p2#SP#subpart20.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p2#SP#subpart21.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p2#SP#subpart21.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p1#SP#subpart10.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p1#SP#subpart11.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p2#SP#subpart20.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p2#SP#subpart21.MYD
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p1#SP#subpart10.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p1#SP#subpart11.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p2#SP#subpart20.MYI
|
|
||||||
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p2#SP#subpart21.MYI
|
|
||||||
|
|
||||||
drop table t1;
|
|
||||||
--exec rmdir $MYSQLTEST_VARDIR/master-data/tmpdata || true
|
|
||||||
--exec rmdir $MYSQLTEST_VARDIR/master-data/tmpinx || true
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug 21388: Bigint fails to find record
|
# Bug 21388: Bigint fails to find record
|
||||||
#
|
#
|
||||||
|
100
mysql-test/t/partition_not_windows.test
Normal file
100
mysql-test/t/partition_not_windows.test
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
# Non-windows specific partition tests.
|
||||||
|
--source include/not_windows.inc
|
||||||
|
--source include/have_partition.inc
|
||||||
|
|
||||||
|
# partition.test used to contained the following note:
|
||||||
|
# This test is disabled on Windows due to BUG#19107
|
||||||
|
# All tests passed on Windows except the following which should be moved into
|
||||||
|
# partition.test once the bug has been resolved.
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug 20770 Partitions: DATA DIRECTORY clause change in reorganize
|
||||||
|
# doesn't remove old directory
|
||||||
|
|
||||||
|
--disable_query_log
|
||||||
|
--exec mkdir $MYSQLTEST_VARDIR/master-data/tmpdata || true
|
||||||
|
eval SET @data_dir = 'DATA DIRECTORY = ''$MYSQLTEST_VARDIR/master-data/tmpdata''';
|
||||||
|
let $data_directory = `select @data_dir`;
|
||||||
|
|
||||||
|
--exec mkdir $MYSQLTEST_VARDIR/master-data/tmpinx || true
|
||||||
|
eval SET @inx_dir = 'INDEX DIRECTORY = ''$MYSQLTEST_VARDIR/master-data/tmpinx''';
|
||||||
|
let $inx_directory = `select @inx_dir`;
|
||||||
|
--enable_query_log
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
eval create table t1 (a int) engine myisam
|
||||||
|
partition by range (a)
|
||||||
|
subpartition by hash (a)
|
||||||
|
(partition p0 VALUES LESS THAN (1) $data_directory $inx_directory
|
||||||
|
(SUBPARTITION subpart00, SUBPARTITION subpart01));
|
||||||
|
|
||||||
|
--echo Checking if file exists before alter
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1.frm
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1.par
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p0#SP#subpart00.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p0#SP#subpart00.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p0#SP#subpart01.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p0#SP#subpart01.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p0#SP#subpart00.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p0#SP#subpart01.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p0#SP#subpart00.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p0#SP#subpart01.MYI
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
eval ALTER TABLE t1 REORGANIZE PARTITION p0 INTO
|
||||||
|
(partition p1 VALUES LESS THAN (1) $data_directory $inx_directory
|
||||||
|
(SUBPARTITION subpart10, SUBPARTITION subpart11),
|
||||||
|
partition p2 VALUES LESS THAN (2) $data_directory $inx_directory
|
||||||
|
(SUBPARTITION subpart20, SUBPARTITION subpart21));
|
||||||
|
|
||||||
|
--echo Checking if file exists after alter
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1.frm
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1.par
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p1#SP#subpart10.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p1#SP#subpart10.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p1#SP#subpart11.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p1#SP#subpart11.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p2#SP#subpart20.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p2#SP#subpart20.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p2#SP#subpart21.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/test/t1#P#p2#SP#subpart21.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p1#SP#subpart10.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p1#SP#subpart11.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p2#SP#subpart20.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpdata/t1#P#p2#SP#subpart21.MYD
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p1#SP#subpart10.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p1#SP#subpart11.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p2#SP#subpart20.MYI
|
||||||
|
--file_exists $MYSQLTEST_VARDIR/master-data/tmpinx/t1#P#p2#SP#subpart21.MYI
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
--exec rmdir $MYSQLTEST_VARDIR/master-data/tmpdata || true
|
||||||
|
--exec rmdir $MYSQLTEST_VARDIR/master-data/tmpinx || true
|
||||||
|
|
||||||
|
# End Windows specific test failures.
|
||||||
|
|
||||||
|
# These tests contain non-Windows specific directory/file format.
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug 25141: Crash Server on Partitioning command
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS `example`;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
--disable_abort_on_error
|
||||||
|
CREATE TABLE `example` (
|
||||||
|
`ID_EXAMPLE` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`DESCRIPTION` varchar(30) NOT NULL,
|
||||||
|
`LEVEL` smallint(5) unsigned DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`ID_EXAMPLE`)
|
||||||
|
) ENGINE = MYISAM
|
||||||
|
PARTITION BY HASH(ID_EXAMPLE)(
|
||||||
|
PARTITION p0 DATA DIRECTORY = '/build/5.1/data/partitiontest/p0Data',
|
||||||
|
PARTITION p1 DATA DIRECTORY = '/build/5.1/data/partitiontest/p1Data',
|
||||||
|
PARTITION p2 DATA DIRECTORY = '/build/5.1/data/partitiontest/p2Data',
|
||||||
|
PARTITION p3 DATA DIRECTORY = '/build/5.1/data/partitiontest/p3Data'
|
||||||
|
);
|
||||||
|
--enable_abort_on_error
|
||||||
|
|
29
mysql-test/t/partition_windows.test
Normal file
29
mysql-test/t/partition_windows.test
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# Windows-specific partition tests
|
||||||
|
--source include/windows.inc
|
||||||
|
--source include/have_partition.inc
|
||||||
|
|
||||||
|
# These tests contain Windows specific directory/file format.
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug 25141: Crash Server on Partitioning command
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS `example`;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
--disable_abort_on_error
|
||||||
|
CREATE TABLE `example` (
|
||||||
|
`ID_EXAMPLE` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`DESCRIPTION` varchar(30) NOT NULL,
|
||||||
|
`LEVEL` smallint(5) unsigned DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`ID_EXAMPLE`)
|
||||||
|
) ENGINE = MYISAM
|
||||||
|
PARTITION BY HASH(ID_EXAMPLE)(
|
||||||
|
PARTITION p0 DATA DIRECTORY = 'C:/build/5.1/data/partitiontest/p0Data',
|
||||||
|
PARTITION p1 DATA DIRECTORY = 'C:/build/5.1/data/partitiontest/p1Data',
|
||||||
|
PARTITION p2 DATA DIRECTORY = 'C:/build/5.1/data/partitiontest/p2Data',
|
||||||
|
PARTITION p3 DATA DIRECTORY = 'C:/build/5.1/data/partitiontest/p3Data'
|
||||||
|
);
|
||||||
|
--enable_abort_on_error
|
||||||
|
|
@ -182,8 +182,8 @@ uint build_table_filename(char *buff, size_t bufflen, const char *db,
|
|||||||
VOID(tablename_to_filename(table_name, tbbuff, sizeof(tbbuff)));
|
VOID(tablename_to_filename(table_name, tbbuff, sizeof(tbbuff)));
|
||||||
|
|
||||||
VOID(tablename_to_filename(db, dbbuff, sizeof(dbbuff)));
|
VOID(tablename_to_filename(db, dbbuff, sizeof(dbbuff)));
|
||||||
length= strxnmov(buff, bufflen, mysql_data_home, "/", dbbuff,
|
length= strxnmov(buff, bufflen, mysql_data_home, FN_ROOTDIR, dbbuff,
|
||||||
"/", tbbuff, ext, NullS) - buff;
|
FN_ROOTDIR, tbbuff, ext, NullS) - buff;
|
||||||
DBUG_PRINT("exit", ("buff: '%s'", buff));
|
DBUG_PRINT("exit", ("buff: '%s'", buff));
|
||||||
DBUG_RETURN(length);
|
DBUG_RETURN(length);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user