CWE-835: Loop with Unreachable Exit Condition ('Infinite Loop')
Description
The product contains an iteration or loop with an exit condition that cannot be reached, i.e., an infinite loop.
Submission Date :
March 22, 2011, midnight
Modification Date :
2023-10-26 00:00:00+00:00
Organization :
MITRE
Extended Description
If the loop can be influenced by an attacker, this weakness could allow attackers to consume excessive resources such as CPU or memory.
Example - 1
In the following code the method processMessagesFromServer attempts to establish a connection to a server and read and process messages from the server. The method uses a do/while loop to continue trying to establish the connection to the server when an attempt fails.
// // create socket to connect to server//
// // establish connection to server//
// // if connected then read and process messages from server//
// // read and process messages//
...
connected = connect(servsock, (struct sockaddr *)&servaddr, sizeof(servaddr));if (connected > -1) {}
// // keep trying to establish connection to the server//
// // close socket and return success or failure//
...int servsock;int connected;struct sockaddr_in servaddr;servsock = socket( AF_INET, SOCK_STREAM, 0);memset( &servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(port);servaddr.sin_addr.s_addr = inet_addr(hostaddr);do {} while (connected < 0);...int processMessagesFromServer(char *hostaddr, int port) {}
However, this will create an infinite loop if the server does not respond. This infinite loop will consume system resources and can be used to create a denial of service attack. To resolve this a counter should be used to limit the number of attempts to establish a connection to the server, as in the following code.
// // initialize number of attempts counter//
// // establish connection to server//
// // increment counter//
// // if connected then read and process messages from server//
// // read and process messages//
...
connected = connect(servsock, (struct sockaddr *)&servaddr, sizeof(servaddr));count++;if (connected > -1) {}
// // keep trying to establish connection to the server//
// // up to a maximum number of attempts//
// // close socket and return success or failure//
...int count = 0;do {} while (connected < 0 && count < MAX_ATTEMPTS);...int processMessagesFromServer(char *hostaddr, int port) {}
Example - 2
For this example the method isReorderNeeded as part of a bookstore application that determines if a particular book needs to be reordered based on the current inventory count and the rate at which the book is being sold.
// // get inventory count for book//
// // find number of days until inventory count reaches minimum//
inventoryCount = inventoryCount - rateSold;days++;
// // if number of days within reorder timeframe//
// // set reorder return boolean to true//
isReorder = true;
boolean isReorder = false;int minimumCount = 10;int days = 0;int inventoryCount = inventory.getIventoryCount(bookISBN);while (inventoryCount > minimumCount) {}if (days > 0 && days < 5) {}return isReorder;public boolean isReorderNeeded(String bookISBN, int rateSold) {}
However, the while loop will become an infinite loop if the rateSold input parameter has a value of zero since the inventoryCount will never fall below the minimumCount. In this case the input parameter should be validated to ensure that a value of zero does not cause an infinite loop,as in the following code.
// // validate rateSold variable//
return isReorder;
...if (rateSold < 1) {}...public boolean isReorderNeeded(String bookISBN, int rateSold) {}
Related Weaknesses
This table shows the weaknesses and high level categories that are related to this weakness. These relationships are defined to give an overview of the different insight to similar items that may exist at higher and lower levels of abstraction.
Visit http://cwe.mitre.org/ for more details.