First of all: use at most one package to format the table of contents, i.e. either tocloft or tocstyle or tocbasic or ...
Unfortunaly the MWE does not show the issue. So the following is only a guess:
Maybe subsection 9.1 is followed by subsection 9.2 and subsection 9.2.1.
Package tocstyle avoids page breaks between a sectioning level followed by a lower section level. Here lower section level means higher section level number. So there is no page break allowed between a section and the first subsection entry or between a subsection and the first subsubsection entry.
Note that package tocstyle is an alpha version and AFAIK this status will never change. The author suggests to use package tocbasic instead:
\usepackage{tocbasic}[2017/01/03]
\DeclareTOCStyleEntry[dynnumwidth]{tocline}{section}
\DeclareTOCStyleEntry[dynnumwidth]{tocline}{subsection}
\DeclareTOCStyleEntry[dynnumwidth]{tocline}{subsubsection}
tocbasic avoids the page breaks between a section entry and its first subsection too.
Example:

But you can change this behavior using option onstarthigherlevel=\LastTOCLevelWasSame (onstarthighersectionlevel refers to the section level number). Note that I do not recommend this, but it is possible:
\usepackage{tocbasic}[2017/01/03]
\DeclareTOCStyleEntry[dynnumwidth,onstarthigherlevel=\LastTOCLevelWasSame]{tocline}{section}
\DeclareTOCStyleEntry[dynnumwidth,onstarthigherlevel=\LastTOCLevelWasSame]{tocline}{subsection}
\DeclareTOCStyleEntry[dynnumwidth,onstarthigherlevel=\LastTOCLevelWasSame]{tocline}{subsubsection}

Code:
\documentclass[12pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{tocbasic}[2017/01/03]
\DeclareTOCStyleEntry[dynnumwidth,onstarthigherlevel=\LastTOCLevelWasSame]{tocline}{section}
\DeclareTOCStyleEntry[dynnumwidth,onstarthigherlevel=\LastTOCLevelWasSame]{tocline}{subsection}
\DeclareTOCStyleEntry[dynnumwidth,onstarthigherlevel=\LastTOCLevelWasSame]{tocline}{subsubsection}
\usepackage{blindtext}% for dummy text
\usepackage{showframe}% to show the page layout
\begin{document}
\tableofcontents
\Blinddocument\Blinddocument\Blinddocument
\Blinddocument\Blinddocument\Blinddocument
\end{document}
If you want to use package tocloft then remove tocstyle and change the settings for the numwidths and indents in ToC manuelly:
\documentclass[12pt,a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{tocloft}
\renewcommand*\cftsecnumwidth{2em}
\renewcommand*\cftsubsecindent{2em}
\renewcommand*\cftsubsecnumwidth{2.8em}
\renewcommand*\cftsubsubsecindent{4.8em}
\usepackage{blindtext}% for dummy text
\usepackage{showframe}% to show the page layout
\begin{document}
\tableofcontents
\Blinddocument\Blinddocument\Blinddocument
\Blinddocument\Blinddocument\Blinddocument
\end{document}

\enlargethispage*{1\baselineskip}if it happens on the first page of the table of contents. Or change the geometry of the pages corresponding to this table with\newgeometry{textheight=…}before calling the table of contents, and\restoregeometryat the end. Or slihghly reduce the interline skip in the table. – Bernard May 26 '17 at 00:21\enlargethispage*{1\baselineskip}precisely sir ? @Bernard – Hussein Eid May 26 '17 at 01:52\tableofcontentsbut I got nothing. Can you test it please?!. Is there another solution? @Bernard – Hussein Eid May 26 '17 at 14:30\tableofcontents. Otherwise there's the solution with geometry (increasing temporarily the text height, then restoring the normal height), or reformatting the table of contents to have a smaller line skip (only for the table of contents). – Bernard May 26 '17 at 14:50